add recruit

Signed-off-by: Andrey Platov <andrey@hardcoreeng.com>
This commit is contained in:
Andrey Platov 2021-08-07 19:03:06 +02:00
parent d8f262df9f
commit f67908b5b4
No known key found for this signature in database
GPG Key ID: C8787EFEB4B64AF0
59 changed files with 2536 additions and 273 deletions

View File

@ -21,6 +21,8 @@ specifiers:
'@rush-temp/model-chunter': file:./projects/model-chunter.tgz
'@rush-temp/model-contact': file:./projects/model-contact.tgz
'@rush-temp/model-core': file:./projects/model-core.tgz
'@rush-temp/model-demo': file:./projects/model-demo.tgz
'@rush-temp/model-recruit': file:./projects/model-recruit.tgz
'@rush-temp/model-rig': file:./projects/model-rig.tgz
'@rush-temp/model-task': file:./projects/model-task.tgz
'@rush-temp/model-view': file:./projects/model-view.tgz
@ -30,6 +32,9 @@ specifiers:
'@rush-temp/presentation': file:./projects/presentation.tgz
'@rush-temp/prod': file:./projects/prod.tgz
'@rush-temp/query': file:./projects/query.tgz
'@rush-temp/recruit': file:./projects/recruit.tgz
'@rush-temp/recruit-assets': file:./projects/recruit-assets.tgz
'@rush-temp/recruit-resources': file:./projects/recruit-resources.tgz
'@rush-temp/server': file:./projects/server.tgz
'@rush-temp/server-core': file:./projects/server-core.tgz
'@rush-temp/server-ws': file:./projects/server-ws.tgz
@ -110,6 +115,8 @@ dependencies:
'@rush-temp/model-chunter': file:projects/model-chunter.tgz_6c259fadfeb3a4b20890aefe87070b8b
'@rush-temp/model-contact': file:projects/model-contact.tgz_6c259fadfeb3a4b20890aefe87070b8b
'@rush-temp/model-core': file:projects/model-core.tgz_6c259fadfeb3a4b20890aefe87070b8b
'@rush-temp/model-demo': file:projects/model-demo.tgz_6c259fadfeb3a4b20890aefe87070b8b
'@rush-temp/model-recruit': file:projects/model-recruit.tgz_6c259fadfeb3a4b20890aefe87070b8b
'@rush-temp/model-rig': file:projects/model-rig.tgz_6ab28797e7a22071465f7d680ae81ae5
'@rush-temp/model-task': file:projects/model-task.tgz_6c259fadfeb3a4b20890aefe87070b8b
'@rush-temp/model-view': file:projects/model-view.tgz_6c259fadfeb3a4b20890aefe87070b8b
@ -119,6 +126,9 @@ dependencies:
'@rush-temp/presentation': file:projects/presentation.tgz_c38cf1a7a413db8918b0b4754c21e4c5
'@rush-temp/prod': file:projects/prod.tgz_9242e79bee31c899aa4d2de67405a771
'@rush-temp/query': file:projects/query.tgz_6c259fadfeb3a4b20890aefe87070b8b
'@rush-temp/recruit': file:projects/recruit.tgz_6c259fadfeb3a4b20890aefe87070b8b
'@rush-temp/recruit-assets': file:projects/recruit-assets.tgz
'@rush-temp/recruit-resources': file:projects/recruit-resources.tgz_c38cf1a7a413db8918b0b4754c21e4c5
'@rush-temp/server': file:projects/server.tgz_6c259fadfeb3a4b20890aefe87070b8b
'@rush-temp/server-core': file:projects/server-core.tgz_6c259fadfeb3a4b20890aefe87070b8b
'@rush-temp/server-ws': file:projects/server-ws.tgz_6c259fadfeb3a4b20890aefe87070b8b
@ -8532,7 +8542,7 @@ packages:
dev: false
file:projects/model-all.tgz_6c259fadfeb3a4b20890aefe87070b8b:
resolution: {integrity: sha512-3Gk3U4Oui5kzxzSFM5dM0KrTi9/lgFGV+lc5FcCbGfliwFUIBOJwxj3+nAu0qCWE/BsTAL/h9Oq3/kEre8j/qg==, tarball: file:projects/model-all.tgz}
resolution: {integrity: sha512-9hTEKuheThP0pu/QIH2Czyg1FIVdSfcNBLQQD5yZPyn+Qw61dpHY68fBv5cKVlcNk/Zwm3e+bbJG3ylF4QvyjA==, tarball: file:projects/model-all.tgz}
id: file:projects/model-all.tgz
name: '@rush-temp/model-all'
version: 0.0.0
@ -8553,7 +8563,7 @@ packages:
dev: false
file:projects/model-chunter.tgz_6c259fadfeb3a4b20890aefe87070b8b:
resolution: {integrity: sha512-Fyp9PC9Hir9bpNLM0WzvSRduqiH4I7feu2A4QZzuk+Ezi6ddmHKTAwhjn1K/J9mY3iWyBpJp1FfQN/K2LWuJiw==, tarball: file:projects/model-chunter.tgz}
resolution: {integrity: sha512-z+BvYl8lM7j/95oNcxYkOdOs47V01OyAkrSa7iZZ24+fDpPJvKIJ8Ty3MVITJCadprqD38WGPynWlAbjHvuOUA==, tarball: file:projects/model-chunter.tgz}
id: file:projects/model-chunter.tgz
name: '@rush-temp/model-chunter'
version: 0.0.0
@ -8604,6 +8614,40 @@ packages:
- typescript
dev: false
file:projects/model-demo.tgz_6c259fadfeb3a4b20890aefe87070b8b:
resolution: {integrity: sha512-PF4ieOchEaN7Zgzx5N5Xz1VaIZ6HkXj5v80T8wyRV0ClC2u2ViAzUdrg8mCeG9E1ttwoVPhXjNmxeEV+QgLAZQ==, tarball: file:projects/model-demo.tgz}
id: file:projects/model-demo.tgz
name: '@rush-temp/model-demo'
version: 0.0.0
dependencies:
'@typescript-eslint/eslint-plugin': 4.28.5_a8e83fcad666e1ba86be4b2e27a20aea
eslint: 7.32.0
eslint-plugin-import: 2.23.4_eslint@7.32.0
eslint-plugin-node: 11.1.0_eslint@7.32.0
eslint-plugin-promise: 4.3.1
transitivePeerDependencies:
- '@typescript-eslint/parser'
- supports-color
- typescript
dev: false
file:projects/model-recruit.tgz_6c259fadfeb3a4b20890aefe87070b8b:
resolution: {integrity: sha512-ZTZfTwGPFLYQ5+Ev7IN4fZyBtlh8CrWpRoubFvTgo8HKh9aSs/hQ3NclNYf+1iwzoiJiPaXrGgc9AodNMrJhLw==, tarball: file:projects/model-recruit.tgz}
id: file:projects/model-recruit.tgz
name: '@rush-temp/model-recruit'
version: 0.0.0
dependencies:
'@typescript-eslint/eslint-plugin': 4.28.5_a8e83fcad666e1ba86be4b2e27a20aea
eslint: 7.32.0
eslint-plugin-import: 2.23.4_eslint@7.32.0
eslint-plugin-node: 11.1.0_eslint@7.32.0
eslint-plugin-promise: 4.3.1
transitivePeerDependencies:
- '@typescript-eslint/parser'
- supports-color
- typescript
dev: false
file:projects/model-rig.tgz_6ab28797e7a22071465f7d680ae81ae5:
resolution: {integrity: sha512-dt7CdKGQAqmtNHpwxDSBqYX/VMBMzPwx1q0bw4EEcdg+GMnClODo7CkYL6VEB++jAFt71USv6AJicS6cdnF8Pg==, tarball: file:projects/model-rig.tgz}
id: file:projects/model-rig.tgz
@ -8762,7 +8806,7 @@ packages:
dev: false
file:projects/prod.tgz_9242e79bee31c899aa4d2de67405a771:
resolution: {integrity: sha512-7EQmn4HF+UC7i1Ia43tXlAiswU3iaa2E/OpX7QquArY63qNtKjR44PYrVb2a2q10kzXDHZv2hEhk6TZFsSNUBQ==, tarball: file:projects/prod.tgz}
resolution: {integrity: sha512-KwU2YgWoCY4XohrdVNdX9DrLtDBkUwkU+lZIwzCfFWazzxTFtyUpiDPY9WLNT+7l9yePGsEpcCxbyDLQFppznA==, tarball: file:projects/prod.tgz}
id: file:projects/prod.tgz
name: '@rush-temp/prod'
version: 0.0.0
@ -8818,6 +8862,53 @@ packages:
- typescript
dev: false
file:projects/recruit-assets.tgz:
resolution: {integrity: sha512-vMhv0+mg/VEguAQ7zzIHr9ieE2F+3kf+lX+FvCpIN+CyDIluiDVzlxp2e2VQ/1pCA9Wkt+u6bwHklbwyU7WDFg==, tarball: file:projects/recruit-assets.tgz}
name: '@rush-temp/recruit-assets'
version: 0.0.0
dev: false
file:projects/recruit-resources.tgz_c38cf1a7a413db8918b0b4754c21e4c5:
resolution: {integrity: sha512-e8G+P/AxPPLmj7mbc0Jzoj9Isc8uZJx0QOhpKXdbVIfpVwBAqIBKLBHaZJW75iSnnXGuD6wZVwrvzCLIHBTPag==, tarball: file:projects/recruit-resources.tgz}
id: file:projects/recruit-resources.tgz
name: '@rush-temp/recruit-resources'
version: 0.0.0
dependencies:
sass: 1.37.5
svelte: 3.42.1
svelte-loader: 3.1.2_svelte@3.42.1
svelte-preprocess: 4.7.4_c407529626dbb58d14a718f48c7fa84c
transitivePeerDependencies:
- '@babel/core'
- coffeescript
- less
- node-sass
- postcss
- postcss-load-config
- pug
- stylus
- sugarss
- typescript
dev: false
file:projects/recruit.tgz_6c259fadfeb3a4b20890aefe87070b8b:
resolution: {integrity: sha512-kVE1YZLi0qv2//sqMhM3SSVew4V36r58Tk0xcA4cP91HeGuozqi4h0V9eYLJocVX2vk3555kQPgTVCNDKM2uwg==, tarball: file:projects/recruit.tgz}
id: file:projects/recruit.tgz
name: '@rush-temp/recruit'
version: 0.0.0
dependencies:
'@types/heft-jest': 1.0.2
'@typescript-eslint/eslint-plugin': 4.28.5_a8e83fcad666e1ba86be4b2e27a20aea
eslint: 7.32.0
eslint-plugin-import: 2.23.4_eslint@7.32.0
eslint-plugin-node: 11.1.0_eslint@7.32.0
eslint-plugin-promise: 4.3.1
transitivePeerDependencies:
- '@typescript-eslint/parser'
- supports-color
- typescript
dev: false
file:projects/server-core.tgz_6c259fadfeb3a4b20890aefe87070b8b:
resolution: {integrity: sha512-lHE4PAWrX+WKdM9/Yy1rYZW6rCacwLMkSUIJakrXZeyGlNytXXSvH20bgfocVn73grez3Zjy6qlNm7H7EClgDQ==, tarball: file:projects/server-core.tgz}
id: file:projects/server-core.tgz

View File

@ -58,6 +58,9 @@
"@anticrm/task-resources": "~0.6.0",
"@anticrm/chunter": "~0.6.0",
"@anticrm/chunter-assets": "~0.6.0",
"@anticrm/chunter-resources": "~0.6.0"
"@anticrm/chunter-resources": "~0.6.0",
"@anticrm/recruit": "~0.6.0",
"@anticrm/recruit-assets": "~0.6.0",
"@anticrm/recruit-resources": "~0.6.0"
}
}

View File

@ -22,8 +22,7 @@ import { viewId } from '@anticrm/view'
import { taskId } from '@anticrm/task'
import { contactId } from '@anticrm/contact'
import { chunterId } from '@anticrm/chunter'
// import { recruitId } from '@anticrm/recruit'
// import { tableId } from '@anticrm/table'
import { recruitId } from '@anticrm/recruit'
// import { chunterServerId } from '@anticrm/chunter-server'
@ -31,7 +30,7 @@ import '@anticrm/login-assets'
import '@anticrm/task-assets'
import '@anticrm/view-assets'
import '@anticrm/chunter-assets'
// import '@anticrm/recruit-assets'
import '@anticrm/recruit-assets'
export function configurePlatform() {
@ -49,9 +48,8 @@ export function configurePlatform() {
addLocation(taskId, () => import(/* webpackChunkName: "task" */ '@anticrm/task-resources'))
addLocation(contactId, () => import(/* webpackChunkName: "contact" */ '@anticrm/contact-resources'))
addLocation(chunterId, () => import(/* webpackChunkName: "chunter" */ '@anticrm/chunter-resources'))
// // addLocation(recruitId, () => import(/* webpackChunkName: "recruit" */ '@anticrm/plugin-recruit'))
// addLocation(tableId, () => import(/* webpackChunkName: "table" */ '@anticrm/table-resources'))
addLocation(recruitId, () => import(/* webpackChunkName: "recruit" */ '@anticrm/recruit-resources'))
// addLocation(chunterServerId, () => import(/* webpackChunkName: "chunter-server" */ '@anticrm/chunter-server'))
}

File diff suppressed because it is too large Load Diff

View File

@ -26,6 +26,8 @@
"@anticrm/model-workbench": "~0.6.0",
"@anticrm/model-contact": "~0.6.0",
"@anticrm/model-task": "~0.6.0",
"@anticrm/model-chunter": "~0.6.0"
"@anticrm/model-chunter": "~0.6.0",
"@anticrm/model-recruit": "~0.6.0",
"@anticrm/model-demo": "~0.6.0"
}
}

View File

@ -21,9 +21,9 @@ import { createModel as workbenchModel } from '@anticrm/model-workbench'
import { createModel as contactModel } from '@anticrm/model-contact'
import { createModel as taskModel } from '@anticrm/model-task'
import { createModel as chunterModel } from '@anticrm/model-chunter'
// import { createModel as recruitModel } from '@anticrm/model-recruit'
import { createModel as recruitModel } from '@anticrm/model-recruit'
// import { createDemo } from '@anticrm/model-demo'
import { createDemo } from '@anticrm/model-demo'
const builder = new Builder()
@ -33,8 +33,8 @@ workbenchModel(builder)
contactModel(builder)
chunterModel(builder)
taskModel(builder)
// recruitModel(builder)
recruitModel(builder)
// createDemo(builder)
createDemo(builder)
export default builder

6
models/demo/.eslintrc.js Normal file
View File

@ -0,0 +1,6 @@
module.exports = {
extends: ['./node_modules/@anticrm/model-rig/profiles/default/config/eslint.config.json'],
parserOptions: {
project: './tsconfig.json'
}
}

4
models/demo/.npmignore Normal file
View File

@ -0,0 +1,4 @@
*
!/lib/**
!CHANGELOG.md
/lib/**/__tests__/

View File

@ -0,0 +1,18 @@
// The "rig.json" file directs tools to look for their config files in an external package.
// Documentation for this system: https://www.npmjs.com/package/@rushstack/rig-package
{
"$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json",
/**
* (Required) The name of the rig package to inherit from.
* It should be an NPM package name with the "-rig" suffix.
*/
"rigPackageName": "@anticrm/model-rig"
/**
* (Optional) Selects a config profile from the rig package. The name must consist of
* lowercase alphanumeric words separated by hyphens, for example "sample-profile".
* If omitted, then the "default" profile will be used."
*/
// "rigProfile": "your-profile-name"
}

25
models/demo/package.json Normal file
View File

@ -0,0 +1,25 @@
{
"name": "@anticrm/model-demo",
"version": "0.6.0",
"main": "lib/index.js",
"author": "Anticrm Platform Contributors",
"license": "EPL-2.0",
"scripts": {
"build": "heft build",
"lint:fix": "eslint --fix src"
},
"devDependencies": {
"@anticrm/model-rig":"~0.6.0",
"@typescript-eslint/eslint-plugin":"4",
"eslint-plugin-import":"2",
"eslint-plugin-promise":"4",
"eslint-plugin-node":"11",
"eslint":"^7.32.0"
},
"dependencies": {
"@anticrm/core": "~0.6.7",
"@anticrm/model": "~0.6.0",
"@anticrm/platform": "~0.6.3",
"@anticrm/model-recruit":"~0.6.0"
}
}

37
models/demo/src/index.ts Normal file
View File

@ -0,0 +1,37 @@
//
// Copyright © 2020, 2021 Anticrm Platform Contributors.
// Copyright © 2021 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import { Builder } from '@anticrm/model'
import recruit from '@anticrm/model-recruit'
export function createDemo (builder: Builder): void {
builder.createDoc(recruit.class.Candidate, recruit.space.CandidatesPublic, {
firstName: 'Andrey',
lastName: 'P.',
email: 'andrey@hc.engineering',
phone: '+1 646 667 6832',
city: 'Monte Carlo'
})
builder.createDoc(recruit.class.Candidate, recruit.space.CandidatesPublic, {
firstName: 'Marina',
lastName: 'M.',
email: 'marina@hc.engineering',
phone: '+1 646 777 3333',
city: 'Los Angeles'
})
}

View File

@ -0,0 +1,8 @@
{
"extends": "./node_modules/@anticrm/model-rig/profiles/default/tsconfig.json",
"compilerOptions": {
"rootDir": "./src",
"outDir": "./lib",
}
}

View File

@ -0,0 +1,6 @@
module.exports = {
extends: ['./node_modules/@anticrm/model-rig/profiles/default/config/eslint.config.json'],
parserOptions: {
project: './tsconfig.json'
}
}

View File

@ -0,0 +1,4 @@
*
!/lib/**
!CHANGELOG.md
/lib/**/__tests__/

View File

@ -0,0 +1,18 @@
// The "rig.json" file directs tools to look for their config files in an external package.
// Documentation for this system: https://www.npmjs.com/package/@rushstack/rig-package
{
"$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json",
/**
* (Required) The name of the rig package to inherit from.
* It should be an NPM package name with the "-rig" suffix.
*/
"rigPackageName": "@anticrm/model-rig"
/**
* (Optional) Selects a config profile from the rig package. The name must consist of
* lowercase alphanumeric words separated by hyphens, for example "sample-profile".
* If omitted, then the "default" profile will be used."
*/
// "rigProfile": "your-profile-name"
}

View File

@ -0,0 +1,32 @@
{
"name": "@anticrm/model-recruit",
"version": "0.6.0",
"main": "lib/index.js",
"author": "Anticrm Platform Contributors",
"license": "EPL-2.0",
"scripts": {
"build": "heft build",
"lint:fix": "eslint --fix src"
},
"devDependencies": {
"@anticrm/model-rig":"~0.6.0",
"@typescript-eslint/eslint-plugin":"4",
"eslint-plugin-import":"2",
"eslint-plugin-promise":"4",
"eslint-plugin-node":"11",
"eslint":"^7.32.0"
},
"dependencies": {
"@anticrm/core": "~0.6.7",
"@anticrm/model": "~0.6.0",
"@anticrm/ui": "~0.6.0",
"@anticrm/contact": "~0.6.0",
"@anticrm/platform": "~0.6.3",
"@anticrm/model-core": "~0.6.0",
"@anticrm/model-view": "~0.6.0",
"@anticrm/model-workbench": "~0.6.0",
"@anticrm/model-contact": "~0.6.0",
"@anticrm/recruit": "~0.6.0",
"@anticrm/recruit-resources": "~0.6.0"
}
}

112
models/recruit/src/index.ts Normal file
View File

@ -0,0 +1,112 @@
//
// Copyright © 2020, 2021 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import type { IntlString } from '@anticrm/platform'
import { Builder, Model, UX, Prop, TypeString } from '@anticrm/model'
import type { Ref, FindOptions, Doc } from '@anticrm/core'
import core, { TSpace, TDoc } from '@anticrm/model-core'
import type { Vacancy, Candidates, Candidate, Applicant } from '@anticrm/recruit'
import workbench from '@anticrm/model-workbench'
import view from '@anticrm/model-view'
import contact, { TPerson } from '@anticrm/model-contact'
import recruit from './plugin'
import { Person } from '@anticrm/contact'
@Model(recruit.class.Vacancy, core.class.Space)
@UX(recruit.string.Vacancy, recruit.icon.Vacancy)
export class TVacancy extends TSpace implements Vacancy {}
@Model(recruit.class.Candidates, core.class.Space)
@UX(recruit.string.CandidatePools, recruit.icon.RecruitApplication)
export class TCandidates extends TSpace implements Candidates {}
@Model(recruit.class.Candidate, contact.class.Person)
@UX('Candidate' as IntlString)
export class TCandidate extends TPerson implements Candidate {}
@Model(recruit.class.Applicant, core.class.Doc)
export class TApplicant extends TDoc implements Applicant {
@Prop(TypeString(), 'Candidate' as IntlString)
candidate!: Ref<Person>
}
export function createModel (builder: Builder): void {
builder.createModel(TVacancy, TCandidates, TCandidate, TApplicant)
builder.mixin(recruit.class.Vacancy, core.class.Class, workbench.mixin.SpaceView, {
view: {
class: recruit.class.Applicant,
createItemDialog: recruit.component.CreateApplication
}
})
builder.mixin(recruit.class.Candidates, core.class.Class, workbench.mixin.SpaceView, {
view: {
class: recruit.class.Candidate,
createItemDialog: recruit.component.CreateCandidate
}
})
builder.createDoc(workbench.class.Application, core.space.Model, {
label: recruit.string.RecruitApplication,
icon: recruit.icon.RecruitApplication,
navigatorModel: {
spaces: [
{
label: recruit.string.Vacancies,
spaceClass: recruit.class.Vacancy,
addSpaceLabel: recruit.string.CreateVacancy,
createComponent: recruit.component.CreateVacancy
},
{
label: recruit.string.CandidatePools,
spaceClass: recruit.class.Candidates,
addSpaceLabel: recruit.string.CreateCandidates,
createComponent: recruit.component.CreateCandidates
}
]
}
})
builder.createDoc(recruit.class.Candidates, core.space.Model, {
name: 'public',
description: 'Public Candidates',
private: false,
members: []
}, recruit.space.CandidatesPublic)
builder.createDoc(view.class.Viewlet, core.space.Model, {
attachTo: recruit.class.Candidate,
descriptor: view.viewlet.Table,
open: recruit.component.EditCandidate,
config: ['', 'email', 'phone', 'city']
})
builder.createDoc(view.class.Viewlet, core.space.Model, {
attachTo: recruit.class.Applicant,
descriptor: view.viewlet.Table,
open: recruit.component.EditCandidate,
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
options: {
lookup: {
candidate: recruit.class.Candidate
}
} as FindOptions<Doc>,
config: ['$lookup.candidate', '$lookup.candidate.email', '$lookup.candidate.city']
})
}
export { default } from './plugin'

View File

@ -0,0 +1,40 @@
//
// Copyright © 2020 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import { mergeIds } from '@anticrm/platform'
import type { IntlString } from '@anticrm/platform'
import type { Ref, Space } from '@anticrm/core'
import type { AnyComponent } from '@anticrm/ui'
import { recruitId } from '@anticrm/recruit'
import recruit from '@anticrm/recruit-resources/src/plugin'
export default mergeIds(recruitId, recruit, {
string: {
RecruitApplication: '' as IntlString,
Vacancies: '' as IntlString,
CandidatePools: '' as IntlString,
Vacancy: '' as IntlString
},
component: {
CreateVacancy: '' as AnyComponent,
CreateCandidates: '' as AnyComponent,
CreateCandidate: '' as AnyComponent,
CreateApplication: '' as AnyComponent,
EditCandidate: '' as AnyComponent
},
space: {
CandidatesPublic: '' as Ref<Space>
}
})

View File

@ -0,0 +1,8 @@
{
"extends": "./node_modules/@anticrm/model-rig/profiles/default/tsconfig.json",
"compilerOptions": {
"rootDir": "./src",
"outDir": "./lib",
}
}

View File

@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="chunter" viewBox="0 0 32 32">
<path d="M25.9,14.6C25.7,9.8,21.9,6,17,5.7h-0.5c0,0,0,0,0,0c-1.4,0-2.9,0.3-4.2,1c-3.2,1.6-5.2,4.8-5.2,8.4c0,1.4,0.3,2.7,0.9,4 l-1.9,5.7c-0.1,0.2,0,0.5,0.1,0.6c0.1,0.1,0.3,0.2,0.4,0.2c0.1,0,0.1,0,0.2,0l5.7-1.9c1.2,0.6,2.6,0.9,4,0.9c0,0,0,0,0,0 c3.6,0,6.8-2,8.4-5.2c0.7-1.3,1-2.8,1-4.2L25.9,14.6z M24.7,15.1C24.7,15.1,24.7,15.1,24.7,15.1c0,1.3-0.3,2.5-0.9,3.7 c-1.4,2.8-4.2,4.5-7.3,4.5c0,0,0,0,0,0c-1.3,0-2.5-0.3-3.6-0.9c-0.1-0.1-0.3-0.1-0.5,0l-4.8,1.6l1.6-4.8c0.1-0.2,0-0.3,0-0.5 c-0.6-1.1-0.9-2.4-0.9-3.7c0-3.1,1.7-5.9,4.5-7.3c1.1-0.6,2.4-0.9,3.6-0.9c0,0,0,0,0,0l0.5,0c4.2,0.2,7.5,3.6,7.7,7.7V15.1z"/>
</symbol>
<symbol id="hashtag" viewBox="0 0 16 16">
<path d="M14,9.6h-3.2l0.4-3.2H14c0.3,0,0.6-0.3,0.6-0.6S14.3,5.2,14,5.2h-2.7l0.4-3.7c0-0.3-0.2-0.6-0.5-0.7 c-0.3,0-0.6,0.2-0.7,0.5l-0.4,3.8H6.9l0.4-3.7c0-0.3-0.2-0.6-0.5-0.7c-0.3,0-0.6,0.2-0.7,0.5L5.7,5.2H2.3C2,5.2,1.7,5.5,1.7,5.8 S2,6.4,2.3,6.4h3.2L5.2,9.6H2.3c-0.3,0-0.6,0.3-0.6,0.6s0.3,0.6,0.6,0.6h2.7l-0.4,3.7c0,0.3,0.2,0.6,0.5,0.7c0,0,0,0,0.1,0 c0.3,0,0.6-0.2,0.6-0.5l0.4-3.8h3.2L9,14.5c0,0.3,0.2,0.6,0.5,0.7c0,0,0,0,0.1,0c0.3,0,0.6-0.2,0.6-0.5l0.4-3.8H14 c0.3,0,0.6-0.3,0.6-0.6S14.3,9.6,14,9.6z M6.4,9.6l0.4-3.2h3.2L9.6,9.6H6.4z"/>
</symbol>
<symbol id="lock" viewBox="0 0 16 16">
<path d="M13,6.9h-1.1V4.8c0-2.2-1.8-3.9-3.9-3.9c-2.2,0-3.9,1.8-3.9,3.9v2.1H3c-0.9,0-1.6,0.7-1.6,1.6v5.3 c0,0.9,0.7,1.6,1.6,1.6h10c0.9,0,1.6-0.7,1.6-1.6V8.5C14.6,7.6,13.9,6.9,13,6.9z M5.3,4.8c0-1.5,1.2-2.7,2.7-2.7s2.7,1.2,2.7,2.7 v2.1H5.3V4.8z M13.4,13.8c0,0.2-0.2,0.4-0.4,0.4H3c-0.2,0-0.4-0.2-0.4-0.4V8.5c0-0.2,0.2-0.4,0.4-0.4h10c0.2,0,0.4,0.2,0.4,0.4V13.8 z"/>
</symbol>
<symbol id="recruitment" viewBox="0 0 24 24">
<g>
<path d="M9.6,14.4c-1.8,0-7.4,0-7.4,3.4c0,3,4.2,3.4,7.4,3.4c1.8,0,7.4,0,7.4-3.4C17.1,14.7,12.8,14.4,9.6,14.4z M9.6,20c-4.1,0-6.2-0.7-6.2-2.2c0-1.5,2.1-2.2,6.2-2.2s6.2,0.7,6.2,2.2C15.9,19.2,13.8,20,9.6,20z"/>
<path d="M9.6,12.4C9.6,12.4,9.7,12.4,9.6,12.4c1.4,0,2.6-0.5,3.5-1.5c0.9-0.9,1.4-2.2,1.4-3.5c0-2.7-2.2-5-5-5 c-2.7,0-5,2.2-5,5C4.7,10.1,6.9,12.4,9.6,12.4z M9.6,3.6c2.1,0,3.8,1.7,3.8,3.8c0,1-0.4,2-1.1,2.7c-0.7,0.7-1.7,1.1-2.7,1.1h0 c-2.1,0-3.8-1.7-3.8-3.8C5.9,5.3,7.6,3.6,9.6,3.6z"/>
<path d="M16.5,10c-0.3,0-0.6,0.3-0.5,0.7c0,0.3,0.3,0.5,0.6,0.5c0,0,0.1,0,0.1,0C18.5,11,20,9.3,20,7.4 c0-1.9-1.4-3.5-3.3-3.8C16.4,3.5,16.1,3.7,16,4c-0.1,0.3,0.2,0.6,0.5,0.7c1.3,0.2,2.3,1.3,2.3,2.7C18.8,8.7,17.8,9.9,16.5,10z"/>
<path d="M18.7,13.9c-0.3,0-0.6,0.2-0.7,0.5s0.2,0.6,0.5,0.7c2.1,0.3,2.1,1.1,2.1,1.3c0,0.3-0.1,0.7-0.9,1 c-0.3,0.1-0.5,0.5-0.3,0.8c0.1,0.2,0.3,0.4,0.6,0.4c0.1,0,0.1,0,0.2,0c1.4-0.5,1.7-1.5,1.7-2.1C21.9,15,20.8,14.2,18.7,13.9z"/>
</g>
</symbol>
<symbol id="vacancy" viewBox="0 0 20 20">
<g>
<path d="M14.6,4.6h-1.5c-0.1-1.1-1-1.9-2.1-1.9H9c-1.1,0-2,0.9-2.1,1.9H5.4c-1.5,0-2.8,1.3-2.8,2.8V10 c0,0.2,0.1,0.3,0.2,0.4c2,1.2,4.5,1.8,7.1,1.8c2.6,0,5.2-0.6,7.1-1.8c0.2-0.1,0.2-0.3,0.2-0.4V7.4C17.4,5.8,16.1,4.6,14.6,4.6z M9,3.6H11c0.6,0,1,0.4,1.1,0.9H7.9C8,4,8.5,3.6,9,3.6z M16.4,9.7c-1.8,1-4,1.5-6.4,1.5c-2.3,0-4.6-0.5-6.4-1.5V7.4 c0-1,0.8-1.8,1.8-1.8h9.2c1,0,1.8,0.8,1.8,1.8V9.7z"/>
<path d="M16.9,12.2c-0.3,0-0.5,0.2-0.5,0.5l-0.1,1.9c-0.1,1-0.9,1.8-1.9,1.8H5.7c-1,0-1.8-0.8-1.9-1.8l-0.1-1.9 c0-0.3-0.3-0.5-0.5-0.5c-0.3,0-0.5,0.3-0.5,0.5l0.1,1.9c0.1,1.5,1.4,2.7,2.9,2.7h8.6c1.5,0,2.8-1.2,2.9-2.7l0.1-1.9 C17.4,12.5,17.2,12.2,16.9,12.2z"/>
</g>
</symbol>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -0,0 +1,11 @@
{
"string": {
"Vacancies": "Vacancies",
"CandidatePools": "Candidates",
"VacancyName": "Vacancy Title *",
"VacancyDescription": "Vacancy Description",
"CreateVacancy": "Create Vacancy",
"CreateCandidate": "Create Candidate",
"MakePrivate": "Make Private"
}
}

View File

@ -0,0 +1,21 @@
{
"name": "@anticrm/recruit-assets",
"version": "0.6.0",
"main": "src/index.ts",
"author": "Anticrm Platform Contributors",
"license": "EPL-2.0",
"scripts": {
"build": "",
"build:docs": "api-extractor run --local",
"test": "echo 'no tests'",
"lint": "ts-standard src",
"lint:fix": "ts-standard --fix src",
"format": "prettier --write 'src/**/*.{ts*,js*,yml}' && ts-standard --fix src"
},
"devDependencies": {
},
"dependencies": {
"@anticrm/platform":"~0.6.3",
"@anticrm/recruit":"~0.6.0"
}
}

View File

@ -0,0 +1,25 @@
//
// Copyright © 2020 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import { loadMetadata, addStringsLoader } from '@anticrm/platform'
import recruit, { recruitId } from '@anticrm/recruit'
const icons = require('../assets/icons.svg')
loadMetadata(recruit.icon, {
RecruitApplication: `${icons}#recruitment`,
Vacancy: `${icons}#vacancy`
})
addStringsLoader(recruitId, async (lang: string) => await import(`../lang/${lang}.json`))

View File

@ -0,0 +1,15 @@
{
"compilerOptions": {
"moduleResolution": "node",
"target": "esnext",
"module": "esnext",
"declaration": true,
"outDir": "./lib",
"strict": true,
"esModuleInterop": true,
"lib": [
"esnext",
"dom"
]
}
}

View File

@ -0,0 +1,32 @@
{
"name": "@anticrm/recruit-resources",
"version": "0.6.0",
"main": "src/index.ts",
"author": "Anticrm Platform Contributors",
"license": "EPL-2.0",
"scripts": {
"build": "",
"build:docs": "api-extractor run --local",
"test": "jest",
"lint": "eslint src",
"lint:fix": "eslint --fix src",
"format": "prettier --write 'src/**/*.{ts*,js*,yml}' && eslint --fix src",
"svelte-check": "svelte-check"
},
"devDependencies": {
"svelte-loader":"^3.1.2",
"sass":"^1.37.5",
"svelte-preprocess":"^4.7.4"
},
"dependencies": {
"@anticrm/platform": "~0.6.0",
"@anticrm/core": "~0.6.0",
"svelte": "^3.37.0",
"@anticrm/recruit": "~0.6.0",
"@anticrm/ui": "~0.6.0",
"@anticrm/presentation": "~0.6.0",
"@anticrm/text-editor": "~0.6.0",
"@anticrm/chunter": "~0.6.0",
"@anticrm/contact": "~0.6.0"
}
}

View File

@ -0,0 +1,5 @@
module.exports = {
plugins: [
require('autoprefixer')
]
}

View File

@ -0,0 +1,83 @@
<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { Avatar } from '@anticrm/presentation'
import LabelStatus from './LabelStatus.svelte'
import Tag from './Tag.svelte'
import File from './icons/File.svelte'
interface Person {
firstName: string
lastName: string
email: string
description: string
city: string
state: string
}
export let user: Person
</script>
<div class="card-container">
<div class="status"><LabelStatus label={user.state} color={'var(--primary-button-enabled)'} /></div>
<div class="avatar"><Avatar size={88} /></div>
<div class="name">{user.lastName} {user.firstName}</div>
<div class="description">{user.description}</div>
<div class="city">{user.city}</div>
<Tag icon={File} label={'Application'} />
</div>
<style lang="scss">
.card-container {
display: flex;
flex-direction: column;
align-items: center;
padding: 20px 24px;
background-color: var(--theme-button-bg-enabled);
border: 1px solid var(--theme-bg-accent-color);
border-radius: 12px;
.status {
display: flex;
flex-direction: row-reverse;
width: 100%;
margin-bottom: 16px;
}
.avatar {
height: 88px;
}
.name {
margin: 16px 0 4px;
font-weight: 500;
font-size: 16px;
line-height: 150%;
color: var(--theme-caption-color);
}
.description, .city {
font-size: 12px;
color: var(--theme-content-dark-color);
}
.city {
margin-bottom: 16px;
}
&:hover {
background-color: var(--theme-bg-accent-hover);
box-shadow: 0px 12px 40px rgba(0, 0, 0, .15);
}
}
</style>

View File

@ -0,0 +1,74 @@
<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import type { IntlString } from '@anticrm/platform'
import { Label } from '@anticrm/ui'
import { IconAdd } from '@anticrm/ui'
export let label: IntlString
</script>
<div class="card-container">
<div class="circle">
<div class="icon">
<IconAdd size={'large'} />
</div>
</div>
<Label {label} />
</div>
<style lang="scss">
.card-container {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 20px 24px;
font-size: 14px;
line-height: 18px;
color: var(--theme-caption-color);
background-color: var(--theme-button-bg-enabled);
border: 1px solid var(--theme-bg-accent-color);
border-radius: 12px;
cursor: pointer;
.circle {
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 20px;
width: 80px;
height: 80px;
background-color: var(--theme-bg-accent-color);
border-radius: 50%;
.icon {
width: 24px;
height: 24px;
opacity: .6;
}
}
&:hover {
background-color: var(--theme-bg-accent-hover);
box-shadow: 0px 12px 40px rgba(0, 0, 0, .15);
.circle .icon {
opacity: 1;
}
}
}
</style>

View File

@ -0,0 +1,60 @@
<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { ScrollBox } from '@anticrm/ui'
import Card from './Card.svelte'
import CardEmpty from './CardEmpty.svelte'
interface Person {
firstName: string
lastName: string
email: string
description: string
city: string
state: string
}
const cards: Array<Person> = [
{ firstName: 'Chen', lastName: 'Rosamund', email: 'rosamund@gmail.com', description: 'Software Engineer', city: 'San Francisco', state: 'Offered' },
{ firstName: 'Chen', lastName: 'Rosamund', email: 'rosamund@gmail.com', description: 'Software Engineer', city: 'San Francisco', state: 'Hired' },
{ firstName: 'Chen', lastName: 'Rosamund', email: 'rosamund@gmail.com', description: 'Software Engineer', city: 'San Francisco', state: 'Interview' },
{ firstName: 'Chen', lastName: 'Rosamund', email: 'rosamund@gmail.com', description: 'Software Engineer', city: 'San Francisco', state: 'Submission' },
{ firstName: 'Chen', lastName: 'Rosamund', email: 'rosamund@gmail.com', description: 'Software Engineer', city: 'San Francisco', state: 'Offered' },
{ firstName: 'Chen', lastName: 'Rosamund', email: 'rosamund@gmail.com', description: 'Software Engineer', city: 'San Francisco', state: 'Hired' },
{ firstName: 'Chen', lastName: 'Rosamund', email: 'rosamund@gmail.com', description: 'Software Engineer', city: 'San Francisco', state: 'Interview' },
{ firstName: 'Chen', lastName: 'Rosamund', email: 'rosamund@gmail.com', description: 'Software Engineer', city: 'San Francisco', state: 'Submission' },
{ firstName: 'Chen', lastName: 'Rosamund', email: 'rosamund@gmail.com', description: 'Software Engineer', city: 'San Francisco', state: 'Offered' }
]
</script>
<ScrollBox vertical>
<div class="cards-container">
<CardEmpty label={'Create new task'} />
{#each cards as card}
<Card user={card} />
{/each}
</div>
</ScrollBox>
<style lang="scss">
.cards-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, auto));
grid-auto-rows: minmax(280px, auto);
grid-gap: 24px;
}
</style>

View File

@ -0,0 +1,56 @@
<!--
// Copyright © 2020 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { createEventDispatcher } from 'svelte'
import type { Ref, Space } from '@anticrm/core'
import { DatePicker, EditBox, Dialog, Tabs, Section, Grid } from '@anticrm/ui'
import { UserBox } from '@anticrm/presentation'
import type { Person } from '@anticrm/contact'
import File from './icons/File.svelte'
import Address from './icons/Address.svelte'
import Attachment from './icons/Attachment.svelte'
import { getClient } from '@anticrm/presentation'
import recruit from '../plugin'
export let space: Ref<Space>
const dispatch = createEventDispatcher()
let candidate: Ref<Person>
const client = getClient()
function createCandidate() {
client.createDoc(recruit.class.Applicant, space, {
candidate,
})
}
</script>
<Dialog label={'Create Application'}
okLabel={'Create Application'}
okAction={createCandidate}
on:close={() => { dispatch('close') }}>
<Tabs/>
<Section icon={File} label={'General Information'}>
<Grid>
<UserBox _class={recruit.class.Candidate} title='Candidate' caption='Candidates' bind:value={candidate} show/>
<DatePicker title={'Pick due date'} />
</Grid>
</Section>
</Dialog>

View File

@ -0,0 +1,73 @@
<!--
// Copyright © 2020 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { createEventDispatcher } from 'svelte'
import type { Ref, Space } from '@anticrm/core'
import { TextArea, EditBox, Dialog, Tabs, Section, Grid, DialogHeader } from '@anticrm/ui'
import File from './icons/File.svelte'
import Address from './icons/Address.svelte'
import Attachment from './icons/Attachment.svelte'
import { getClient } from '@anticrm/presentation'
import recruit from '../plugin'
export let space: Ref<Space>
const dispatch = createEventDispatcher()
let firstName: string = ''
let lastName: string = ''
let email: string = ''
let phone: string = ''
let city: string = ''
const client = getClient()
function createCandidate() {
client.createDoc(recruit.class.Candidate, space, {
firstName,
lastName,
email,
phone,
city,
})
}
</script>
<Dialog label={recruit.string.CreateCandidate}
okLabel={recruit.string.CreateCandidate}
okAction={createCandidate}
on:close={() => { dispatch('close') }}>
<DialogHeader />
<Tabs/>
<Section icon={File} label={'Personal Information'}>
<Grid>
<EditBox label={'First name *'} placeholder={'John'} bind:value={firstName} focus/>
<EditBox label={'Last name *'} placeholder={'Smith'} bind:value={lastName}/>
<EditBox label={'Email *'} placeholder={'john.smith@gmail.com'} bind:value={email}/>
<EditBox label={'Phone *'} placeholder={'+00 (000) 000 00'} bind:value={phone}/>
</Grid>
</Section>
<Section icon={Address} label={'Address'}>
<Grid>
<EditBox label={'Street'} placeholder={'Broderick st'} />
<EditBox label={'City *'} placeholder={'Los Angeles'} bind:value={city}/>
<EditBox label={'ZIP / Postal code'} placeholder={'26892'} />
<EditBox label={'Country'} placeholder={'United States'} />
</Grid>
</Section>
</Dialog>

View File

@ -0,0 +1,51 @@
<!--
// Copyright © 2020 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { createEventDispatcher } from 'svelte'
import { TextArea, EditBox, Dialog, ToggleWithLabel, Grid } from '@anticrm/ui'
import { getClient } from '@anticrm/presentation'
import recruit from '../plugin'
import core from '@anticrm/core'
const dispatch = createEventDispatcher()
let name: string = ''
let description: string = ''
const client = getClient()
function createCandidates() {
client.createDoc(recruit.class.Candidates, core.space.Model, {
name,
description,
private: false,
members: []
})
}
</script>
<Dialog label={recruit.string.CreateCandidates}
okLabel={recruit.string.CreateCandidates}
okAction={createCandidates}
on:close={() => { dispatch('close') }}>
<Grid column={1}>
<EditBox label={recruit.string.CandidatesName} bind:value={name} focus/>
<TextArea label={recruit.string.CandidatesDescription} bind:value={description}/>
<ToggleWithLabel label={recruit.string.MakePrivate} description={recruit.string.MakePrivateDescription}/>
</Grid>
</Dialog>

View File

@ -0,0 +1,58 @@
<!--
// Copyright © 2020 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { createEventDispatcher } from 'svelte'
import { TextArea, EditBox, Dialog, ToggleWithLabel, Tabs, Section, Grid } from '@anticrm/ui'
import { getClient } from '@anticrm/presentation'
import File from './icons/File.svelte'
import Recruiting from './icons/Recruiting.svelte'
import recruit from '../plugin'
import core from '@anticrm/core'
const dispatch = createEventDispatcher()
let name: string = ''
let description: string = ''
const client = getClient()
function createVacancy() {
client.createDoc(recruit.class.Vacancy, core.space.Model, {
name,
description,
private: false,
members: []
})
}
</script>
<Dialog label={recruit.string.CreateVacancy}
okLabel={recruit.string.CreateVacancy}
okAction={createVacancy}
on:close={() => { dispatch('close') }}>
<Tabs/>
<Section icon={File} label={'General Information'}>
<Grid column={1}>
<EditBox label={recruit.string.VacancyName} bind:value={name} placeholder="Software Engineer" focus/>
<TextArea label={recruit.string.VacancyDescription} bind:value={description} placeholder="Start typing..."/>
<ToggleWithLabel label={recruit.string.MakePrivate} description={recruit.string.MakePrivateDescription}/>
</Grid>
</Section>
<Section icon={Recruiting} label={'Vacancy Members'}>
</Section>
</Dialog>

View File

@ -0,0 +1,97 @@
<!--
// Copyright © 2020 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { createEventDispatcher } from 'svelte'
import type { Ref, Space, Doc } from '@anticrm/core'
import { TextArea, EditBox, Dialog, Tabs, Section, Grid, DialogHeader, IconComments } from '@anticrm/ui'
import { AttributeEditor, getClient, CommentViewer } from '@anticrm/presentation'
import { ReferenceInput } from '@anticrm/text-editor'
import type { Candidate } from '@anticrm/recruit'
import type { Backlink } from '@anticrm/chunter'
import { Backlink as BacklinkComponent } from '@anticrm/presentation'
import File from './icons/File.svelte'
import Address from './icons/Address.svelte'
import Attachment from './icons/Attachment.svelte'
import { createQuery } from '@anticrm/presentation'
import recruit from '../plugin'
import chunter from '@anticrm/chunter'
import contact from '@anticrm/contact'
export let object: Candidate
let newValue = Object.assign({}, object)
const dispatch = createEventDispatcher()
let backlinks: Backlink[]
const client = getClient()
const query = createQuery()
$: query.query(chunter.class.Backlink, { objectId: object._id }, result => { backlinks = result })
function save() {
const attributes: Record<string, any> = {}
for (const key in object) {
if ((newValue as any)[key] !== (object as any)[key]) {
attributes[key] = (newValue as any)[key]
}
}
client.updateDoc(recruit.class.Candidate, object.space, object._id, attributes)
}
</script>
<Dialog label={recruit.string.CreateCandidate}
okLabel={recruit.string.CreateCandidate}
okAction={save}
on:close={() => { dispatch('close') }}>
<DialogHeader />
<Tabs/>
<Section icon={File} label={'Personal Information'}>
<Grid>
<AttributeEditor _class={contact.class.Person} key={'firstName'} {newValue} oldValue={object} focus/>
<AttributeEditor _class={contact.class.Person} key={'lastName'} {newValue} oldValue={object}/>
<AttributeEditor _class={contact.class.Person} key={'email'} {newValue} oldValue={object}/>
<AttributeEditor _class={contact.class.Person} key={'phone'} {newValue} oldValue={object}/>
</Grid>
</Section>
<Section icon={Address} label={'Address'}>
<Grid>
<EditBox label={'Street'} placeholder={'Broderick st'} />
<EditBox label={'City *'} placeholder={'Los Angeles'} bind:value={newValue.city}/>
<EditBox label={'ZIP / Postal code'} placeholder={'26892'} />
<EditBox label={'Country'} placeholder={'United States'} />
</Grid>
</Section>
<Section icon={IconComments} label={'Comments'}>
<CommentViewer />
<div class="reference"><ReferenceInput /></div>
</Section>
{#if backlinks && backlinks.length > 0}
<Section icon={Address} label={'Backlinks'}>
{#each backlinks as backlink}
<BacklinkComponent {backlink} />
{/each}
</Section>
{/if}
</Dialog>
<style lang="scss">
.reference {
margin-top: 24px;
}
</style>

View File

@ -0,0 +1,51 @@
<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import type { IntlString, Asset } from '@anticrm/platform'
import type { AnySvelteComponent } from '@anticrm/ui'
import { Icon, Label } from '@anticrm/ui'
export let icon: Asset | AnySvelteComponent
export let label: IntlString
</script>
<div class="label-container">
<div class="icon">
{#if typeof (icon) === 'string'}
<Icon {icon} size={'large'}/>
{:else}
<svelte:component this={icon} size={'large'} />
{/if}
</div>
<Label {label} />
</div>
<style lang="scss">
.label-container {
display: flex;
align-items: center;
font-weight: 500;
font-size: 16px;
color: var(--theme-caption-color);
.icon {
margin-right: .5em;
width: 24px;
height: 24px;
}
}
</style>

View File

@ -0,0 +1,91 @@
<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { UserInfo } from '@anticrm/presentation'
import { ActionIcon } from '@anticrm/ui'
import IconWithLabel from './IconWithLabel.svelte'
import Tag from './Tag.svelte'
import File from './icons/File.svelte'
import MoreH from './icons/MoreH.svelte'
interface ICard {
_id: number
firstName: string
lastName: string
description: string
state: number
}
export let card: ICard
export let draggable: boolean
</script>
<div class="card-container" {draggable} class:draggable on:dragstart on:dragend>
<div class="header">
<UserInfo value={{firstName: card.firstName, lastName: card.lastName }} subtitle={'Candidate'} size={28} />
<ActionIcon icon={MoreH} label={'More..'} direction={'left'} />
</div>
<div class="content">
<IconWithLabel icon={File} label={'Team Interview'} />
<div class="description">{card.description}</div>
<div class="tags">
<Tag icon={File} label={'Application'} />
</div>
</div>
</div>
<style lang="scss">
.card-container {
display: flex;
flex-direction: column;
align-items: stretch;
background-color: var(--theme-button-bg-hovered);
border: 1px solid var(--theme-bg-accent-color);
border-radius: 12px;
user-select: none;
.header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 14px 16px;
width: 100%;
min-height: 60px;
background-color: var(--theme-button-bg-focused);
border-radius: 11px 11px 0 0;
}
.content {
display: flex;
flex-direction: column;
align-items: stretch;
padding: 16px;
.description {
margin-top: 8px;
}
.tags {
display: flex;
gap: 8px;
margin-top: 16px;
}
}
&.draggable {
cursor: grab;
}
}
</style>

View File

@ -0,0 +1,59 @@
<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import type { IntlString } from '@anticrm/platform'
import { Label } from '@anticrm/ui'
import { IconAdd } from '@anticrm/ui'
export let label: IntlString
</script>
<div class="card-container">
<div class="icon">
<IconAdd size={'small'} />
</div>
<Label {label} />
</div>
<style lang="scss">
.card-container {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 12px 24px 10px;
font-size: 14px;
color: var(--theme-content-dark-color);
background-color: var(--theme-button-bg-hovered);
border: 1px dotted var(--theme-bg-accent-color);
border-radius: 12px;
cursor: pointer;
.icon {
margin-bottom: 4px;
width: 16px;
height: 16px;
opacity: .4;
}
&:hover {
color: var(--theme-caption-color);
.icon {
opacity: 1;
}
}
}
</style>

View File

@ -0,0 +1,80 @@
<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import type { IntlString } from '@anticrm/platform'
import { Label, ScrollBox } from '@anticrm/ui'
export let label: IntlString
export let color: string
export let counter: number
</script>
<div class="panel-container" on:dragover on:drop>
<div class="header" style="background-color: {color}">
<div class="title"><Label {label} /></div>
<div class="counter">{counter}</div>
</div>
<div class="scroll">
<ScrollBox vertical>
<slot />
</ScrollBox>
</div>
</div>
<style lang="scss">
.panel-container {
display: flex;
flex-direction: column;
align-items: stretch;
width: 320px;
height: 100%;
background-color: var(--theme-button-bg-enabled);
border: 1px solid var(--theme-bg-accent-color);
border-radius: 12px;
.header {
display: flex;
justify-content: space-between;
align-items: center;
margin: 12px;
padding: 8px;
min-height: 44px;
font-weight: 500;
border: 1px solid rgba(0, 0, 0, .1);
border-radius: 8px;
.title {
padding-left: 8px;
color: var(--theme-caption-color);
}
.counter {
display: flex;
justify-content: center;
align-items: center;
width: 28px;
height: 28px;
color: var(--theme-contnet-accent-color);
background-color: rgba(0, 0, 0, .08);
border-radius: 50%;
}
}
.scroll {
margin: 8px 12px 12px;
height: 100%;
}
}
</style>

View File

@ -0,0 +1,76 @@
<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import type { IntlString } from '@anticrm/platform'
import { Label } from '@anticrm/ui'
import { IconAdd } from '@anticrm/ui'
export let label: IntlString
</script>
<div class="panel-container">
<div class="circle">
<div class="icon">
<IconAdd size={'large'} />
</div>
</div>
<Label {label} />
</div>
<style lang="scss">
.panel-container {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
width: 320px;
height: 100%;
padding: 12px;
font-size: 14px;
line-height: 18px;
color: var(--theme-caption-color);
background-color: var(--theme-button-bg-enabled);
border: 1px dotted var(--theme-bg-accent-color);
border-radius: 12px;
cursor: pointer;
.circle {
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 20px;
width: 80px;
height: 80px;
background-color: var(--theme-bg-accent-color);
border-radius: 50%;
.icon {
width: 24px;
height: 24px;
opacity: .6;
}
}
&:hover {
background-color: var(--theme-bg-accent-hover);
box-shadow: 0px 12px 40px rgba(0, 0, 0, .15);
.circle .icon {
opacity: 1;
}
}
}
</style>

View File

@ -0,0 +1,80 @@
<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { ScrollBox } from '@anticrm/ui'
import KanbanPanelEmpty from './KanbanPanelEmpty.svelte'
import KanbanPanel from './KanbanPanel.svelte'
import KanbanCardEmpty from './KanbanCardEmpty.svelte'
import KanbanCard from './KanbanCard.svelte'
interface ICard {
_id: number
firstName: string
lastName: string
description: string
state: number
}
let dragCard: ICard
let states: Array<Object> = [
{ _id: 0, label: 'In progress', color: '#7C6FCD' },
{ _id: 1, label: 'Under review', color: '#6F7BC5' },
{ _id: 2, label: 'Interview', color: '#A5D179' },
{ _id: 3, label: 'Offer', color: '#77C07B' },
{ _id: 4, label: 'Assigned', color: '#F28469' }
]
const cards: Array<ICard> = [
{ _id: 0, firstName: 'Chen', lastName: 'Rosamund', description: '8:30AM, July 12 Voltron, San Francisco', state: 0 },
{ _id: 1, firstName: 'Chen', lastName: 'Rosamund', description: '8:30AM, July 12 Voltron, San Francisco', state: 0 },
{ _id: 2, firstName: 'Chen', lastName: 'Rosamund', description: '8:30AM, July 12 Voltron, San Francisco', state: 0 },
{ _id: 3, firstName: 'Chen', lastName: 'Rosamund', description: '8:30AM, July 12 Voltron, San Francisco', state: 1 },
{ _id: 4, firstName: 'Chen', lastName: 'Rosamund', description: '8:30AM, July 12 Voltron, San Francisco', state: 1 },
{ _id: 5, firstName: 'Chen', lastName: 'Rosamund', description: '8:30AM, July 12 Voltron, San Francisco', state: 2 },
{ _id: 6, firstName: 'Chen', lastName: 'Rosamund', description: '8:30AM, July 12 Voltron, San Francisco', state: 3 },
]
</script>
<ScrollBox>
{#each states as state}
<KanbanPanel label={state.label} color={state.color} counter={4}
on:dragover={(event) => {
event.preventDefault()
}}
on:drop={(event) => {
event.preventDefault()
if (dragCard) {
dragCard.state = state._id
dragCard = undefined
}
}}
>
<KanbanCardEmpty label={'Create new application'} />
{#each cards.filter((c) => c.state === state._id) as card}
<KanbanCard {card} draggable={true}
on:dragstart={() => {
dragCard = card
}}
on:dragend={() => {
dragCard = undefined
}}
/>
{/each}
</KanbanPanel>
{/each}
<KanbanPanelEmpty label={'Add new column'} />
</ScrollBox>

View File

@ -0,0 +1,47 @@
<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import type { IntlString } from '@anticrm/platform'
import { Label } from '@anticrm/ui'
enum StatusColors {
TURQUOISE = '#79C4CE',
PURPLE = '#9D92C4',
STINKYBLUE = '#72A6CC',
GREEN = '#69B46D',
ORANGE = '#C97661'
}
export let label: IntlString
export let color: string = StatusColors.TURQUOISE
</script>
<div class="label-container" style="background-color: {color}">
<Label {label} />
</div>
<style lang="scss">
.label-container {
padding: 4px 8px;
font-weight: 500;
font-size: 12px;
text-align: center;
color: #fff;
border: 1px solid var(--theme-bg-accent-hover);
border-radius: 8px;
}
</style>

View File

@ -0,0 +1,54 @@
<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import type { IntlString, Asset } from '@anticrm/platform'
import type { AnySvelteComponent } from '@anticrm/ui'
import { Icon, Label } from '@anticrm/ui'
export let icon: Asset | AnySvelteComponent
export let label: IntlString
</script>
<div class="tag-container">
<div class="icon">
{#if typeof (icon) === 'string'}
<Icon {icon} size={'small'}/>
{:else}
<svelte:component this={icon} size={'small'} />
{/if}
</div>
<Label {label} />
</div>
<style lang="scss">
.tag-container {
display: flex;
align-items: center;
padding: 6px 10px;
font-size: 12px;
text-align: center;
background-color: var(--theme-bg-accent-color);
color: var(--theme-caption-color);
border-radius: 8px;
.icon {
margin-right: .3em;
width: 16px;
height: 16px;
}
}
</style>

View File

@ -0,0 +1,27 @@
<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
// Copyright © 2021 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { IconSize } from '@anticrm/ui'
export let size: 'small' | 'medium' | 'large'
const fill: string = 'var(--theme-caption-color)'
</script>
<IconSize {size}>
<svg {fill} xmlns="http://www.w3.org/2000/svg">
<path d="M16.1,8.2c-0.3-0.6-0.8-1-1.6-1.8l-0.8-0.7c-1.6-1.4-2.5-2.1-3.6-2.1c-1.1,0-1.9,0.7-3.6,2.1L5.6,6.5 C4.7,7.2,4.2,7.6,3.9,8.2c-0.3,0.6-0.3,1.2-0.3,2.4v3.5c0,1.7,0,2.6,0.6,3.2C4.9,18,5.8,18,7.5,18h0.4c0,0,0,0,0,0s0,0,0,0h4.2 c0,0,0,0,0,0s0,0,0,0h0.4c1.7,0,2.6,0,3.2-0.6c0.6-0.6,0.6-1.5,0.6-3.2v-3.5C16.3,9.5,16.3,8.8,16.1,8.2z M11.6,17H8.4v-3.5 c0-0.3,0.2-0.5,0.5-0.5h2.2c0.3,0,0.5,0.2,0.5,0.5V17z M15.3,14.2c0,1.5,0,2.2-0.3,2.5C14.7,17,14,17,12.6,17v-3.5 c0-0.8-0.7-1.5-1.5-1.5H8.9c-0.8,0-1.5,0.7-1.5,1.5V17C6,17,5.3,17,5,16.7c-0.3-0.3-0.3-1-0.3-2.5v-3.5c0-1.1,0-1.6,0.2-2 s0.6-0.7,1.4-1.4l0.8-0.7C8.5,5.3,9.3,4.6,10,4.6s1.5,0.6,2.9,1.9l0.8,0.7c0.8,0.7,1.2,1,1.4,1.4s0.2,0.9,0.2,2V14.2z"/>
</svg>
</IconSize>

View File

@ -0,0 +1,27 @@
<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
// Copyright © 2021 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { IconSize } from '@anticrm/ui'
export let size: 'small' | 'medium' | 'large'
const fill: string = 'var(--theme-caption-color)'
</script>
<IconSize {size}>
<svg {fill} xmlns="http://www.w3.org/2000/svg">
<path d="M4.8,10.5l5.7-5.7c1.2-1.2,3.1-1.2,4.2,0s1.2,3.1,0,4.2L8,15.8c-0.6,0.6-1.5,0.6-2.1,0c-0.6-0.6-0.6-1.5,0-2.1l6-6 c0.2-0.2,0.2-0.5,0-0.7c-0.2-0.2-0.5-0.2-0.7,0l-6,6c-1,1-1,2.6,0,3.5c1,1,2.6,1,3.5,0l6.7-6.7c1.6-1.6,1.6-4.1,0-5.7 s-4.1-1.6-5.7,0L4.1,9.8c-0.2,0.2-0.2,0.5,0,0.7C4.3,10.7,4.6,10.7,4.8,10.5z"/>
</svg>
</IconSize>

View File

@ -0,0 +1,27 @@
<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
// Copyright © 2021 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { IconSize } from '@anticrm/ui'
export let size: 'small' | 'medium' | 'large'
const fill: string = 'var(--theme-caption-color)'
</script>
<IconSize {size}>
<svg {fill} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
<path d="M15.7,2.6C15.1,2,14.2,2,12.5,2H9.9C9.5,2,9.2,2,9,2.1S8.6,2.4,8.3,2.6l-4,4C4,6.9,3.9,7.1,3.8,7.3C3.7,7.6,3.7,7.8,3.7,8.2 v6c0,1.7,0,2.6,0.6,3.2S5.8,18,7.5,18h5c1.7,0,2.6,0,3.2-0.6s0.6-1.5,0.6-3.2V5.8C16.3,4.2,16.3,3.3,15.7,2.6z M5,7.4l4-4 C9.2,3.2,9.3,3.1,9.4,3c0,0,0.1,0,0.1,0v3.4c0,0.7,0,1.2-0.1,1.3C9.2,7.8,8.8,7.8,8.1,7.8H4.7c0,0,0-0.1,0-0.1 C4.7,7.7,4.8,7.5,5,7.4z M15.3,14.2c0,1.5,0,2.2-0.3,2.5S14,17,12.5,17h-5C6,17,5.3,17,5,16.7s-0.3-1-0.3-2.5V8.8h3.4 c1,0,1.6,0,2-0.4c0.4-0.4,0.4-1,0.4-2V3h2C14,3,14.7,3,15,3.3s0.3,1,0.3,2.5V14.2z"/>
</svg>
</IconSize>

View File

@ -0,0 +1,27 @@
<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
// Copyright © 2021 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { IconSize } from '@anticrm/ui'
export let size: 'small' | 'medium' | 'large'
const fill: string = 'var(--theme-caption-color)'
</script>
<IconSize {size}>
<svg {fill} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<path d="M12.9,2.7H3.1c-1,0-1.7,0.8-1.7,1.7v7.5c0,1,0.8,1.7,1.7,1.7h9.9c1,0,1.7-0.8,1.7-1.7V4.4C14.7,3.5,13.9,2.7,12.9,2.7z M12.9,3.7c0.1,0,0.2,0,0.3,0.1L8,7.9L2.8,3.8c0.1,0,0.2-0.1,0.3-0.1H12.9z M12.9,12.6H3.1c-0.4,0-0.7-0.3-0.7-0.7V4.7L7.7,9 C7.8,9,7.9,9.1,8,9.1S8.2,9,8.3,9l5.4-4.3v7.2C13.7,12.3,13.3,12.6,12.9,12.6z"/>
</svg>
</IconSize>

View File

@ -0,0 +1,13 @@
<script lang="ts">
import { IconSize } from '@anticrm/ui'
export let size: 'small' | 'medium' | 'large'
const fill: string = 'var(--theme-caption-color)'
</script>
<IconSize {size}>
<svg {fill} viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="M11.8,10.3c-1,0-1.8,0.8-1.8,1.7s0.8,1.7,1.8,1.7c1,0,1.8-0.8,1.8-1.7S12.7,10.3,11.8,10.3z" />
<path d="M18,10.3c-1,0-1.8,0.8-1.8,1.7s0.8,1.7,1.8,1.7c1,0,1.8-0.8,1.8-1.7S18.9,10.3,18,10.3z" />
<path d="M5.5,10.3c-1,0-1.8,0.8-1.8,1.7s0.8,1.7,1.8,1.7c1,0,1.8-0.8,1.8-1.7S6.5,10.3,5.5,10.3z" />
</svg>
</IconSize>

View File

@ -0,0 +1,32 @@
<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
// Copyright © 2021 Hardcore Engineering Inc.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { IconSize } from '@anticrm/ui'
export let size: 'small' | 'medium' | 'large'
const fill: string = 'var(--theme-caption-color)'
</script>
<IconSize {size}>
<svg {fill} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<g>
<path d="M9.6,14.4c-1.8,0-7.4,0-7.4,3.4c0,3,4.2,3.4,7.4,3.4c1.8,0,7.4,0,7.4-3.4C17.1,14.7,12.8,14.4,9.6,14.4z M9.6,20c-4.1,0-6.2-0.7-6.2-2.2c0-1.5,2.1-2.2,6.2-2.2s6.2,0.7,6.2,2.2C15.9,19.2,13.8,20,9.6,20z"/>
<path d="M9.6,12.4C9.6,12.4,9.7,12.4,9.6,12.4c1.4,0,2.6-0.5,3.5-1.5c0.9-0.9,1.4-2.2,1.4-3.5c0-2.7-2.2-5-5-5 c-2.7,0-5,2.2-5,5C4.7,10.1,6.9,12.4,9.6,12.4z M9.6,3.6c2.1,0,3.8,1.7,3.8,3.8c0,1-0.4,2-1.1,2.7c-0.7,0.7-1.7,1.1-2.7,1.1h0 c-2.1,0-3.8-1.7-3.8-3.8C5.9,5.3,7.6,3.6,9.6,3.6z"/>
<path d="M16.5,10c-0.3,0-0.6,0.3-0.5,0.7c0,0.3,0.3,0.5,0.6,0.5c0,0,0.1,0,0.1,0C18.5,11,20,9.3,20,7.4 c0-1.9-1.4-3.5-3.3-3.8C16.4,3.5,16.1,3.7,16,4c-0.1,0.3,0.2,0.6,0.5,0.7c1.3,0.2,2.3,1.3,2.3,2.7C18.8,8.7,17.8,9.9,16.5,10z"/>
<path d="M18.7,13.9c-0.3,0-0.6,0.2-0.7,0.5s0.2,0.6,0.5,0.7c2.1,0.3,2.1,1.1,2.1,1.3c0,0.3-0.1,0.7-0.9,1 c-0.3,0.1-0.5,0.5-0.3,0.8c0.1,0.2,0.3,0.4,0.6,0.4c0.1,0,0.1,0,0.2,0c1.4-0.5,1.7-1.5,1.7-2.1C21.9,15,20.8,14.2,18.7,13.9z"/>
</g>
</svg>
</IconSize>

View File

@ -0,0 +1,30 @@
//
// Copyright © 2020 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import CreateVacancy from './components/CreateVacancy.svelte'
import CreateCandidates from './components/CreateCandidates.svelte'
import CreateCandidate from './components/CreateCandidate.svelte'
import CreateApplication from './components/CreateApplication.svelte'
import EditCandidate from './components/EditCandidate.svelte'
export default async () => ({
component: {
CreateVacancy,
CreateCandidates,
CreateCandidate,
CreateApplication,
EditCandidate
},
})

View File

@ -0,0 +1,43 @@
//
// Copyright © 2020 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import { mergeIds } from '@anticrm/platform'
import type { IntlString } from '@anticrm/platform'
import type { Ref, Class } from '@anticrm/core'
import type { Applicant, Candidate, Candidates, Vacancy } from '@anticrm/recruit'
import recruit, { recruitId } from '@anticrm/recruit'
export default mergeIds(recruitId, recruit, {
class: {
Vacancy: '' as Ref<Class<Vacancy>>,
Candidates: '' as Ref<Class<Candidates>>,
Candidate: '' as Ref<Class<Candidate>>,
Applicant: '' as Ref<Class<Applicant>>,
},
string: {
CreateVacancy: '' as IntlString,
VacancyName: '' as IntlString,
VacancyDescription: '' as IntlString,
MakePrivate: '' as IntlString,
MakePrivateDescription: '' as IntlString,
CreateCandidates: '' as IntlString,
CandidatesName: '' as IntlString,
CandidatesDescription: '' as IntlString,
CreateCandidate: '' as IntlString,
FirstName: '' as IntlString,
LastName: '' as IntlString,
}
})

View File

@ -0,0 +1,5 @@
const sveltePreprocess = require('svelte-preprocess')
module.exports = {
preprocess: sveltePreprocess()
};

View File

@ -0,0 +1,15 @@
{
"compilerOptions": {
"moduleResolution": "node",
"target": "esnext",
"module": "esnext",
"declaration": true,
"outDir": "./lib",
"strict": true,
"esModuleInterop": true,
"lib": [
"esnext",
"dom"
]
}
}

View File

@ -0,0 +1,6 @@
module.exports = {
extends: ['./node_modules/@anticrm/platform-rig/profiles/default/config/eslint.config.json'],
parserOptions: {
project: './tsconfig.json'
}
}

View File

@ -0,0 +1,4 @@
*
!/lib/**
!CHANGELOG.md
/lib/**/__tests__/

View File

@ -0,0 +1,18 @@
// The "rig.json" file directs tools to look for their config files in an external package.
// Documentation for this system: https://www.npmjs.com/package/@rushstack/rig-package
{
"$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json",
/**
* (Required) The name of the rig package to inherit from.
* It should be an NPM package name with the "-rig" suffix.
*/
"rigPackageName": "@anticrm/platform-rig"
/**
* (Optional) Selects a config profile from the rig package. The name must consist of
* lowercase alphanumeric words separated by hyphens, for example "sample-profile".
* If omitted, then the "default" profile will be used."
*/
// "rigProfile": "your-profile-name"
}

View File

@ -0,0 +1,25 @@
{
"name": "@anticrm/recruit",
"version": "0.6.0",
"main": "lib/index.js",
"author": "Anticrm Platform Contributors",
"license": "EPL-2.0",
"scripts": {
"build": "heft build",
"lint:fix": "eslint --fix src"
},
"devDependencies": {
"@anticrm/platform-rig":"~0.6.0",
"@types/heft-jest":"^1.0.2",
"@typescript-eslint/eslint-plugin":"4",
"eslint-plugin-import":"2",
"eslint-plugin-promise":"4",
"eslint-plugin-node":"11",
"eslint":"^7.32.0"
},
"dependencies": {
"@anticrm/platform":"~0.6.3",
"@anticrm/core":"~0.6.0",
"@anticrm/contact":"~0.6.0"
}
}

View File

@ -0,0 +1,53 @@
//
// Copyright © 2020, 2021 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import { plugin } from '@anticrm/platform'
import type { Plugin, Asset } from '@anticrm/platform'
import type { Space, Doc, Ref } from '@anticrm/core'
import type { Person } from '@anticrm/contact'
/**
* @public
*/
export interface Vacancy extends Space {}
/**
* @public
*/
export interface Candidates extends Space {}
/**
* @public
*/
export interface Candidate extends Person {}
/**
* @public
*/
export interface Applicant extends Doc {
candidate: Ref<Candidate>
}
/**
* @public
*/
export const recruitId = 'recruit' as Plugin
export default plugin(recruitId, {
icon: {
RecruitApplication: '' as Asset,
Vacancy: '' as Asset
}
})

View File

@ -0,0 +1,9 @@
{
"extends": "./node_modules/@anticrm/platform-rig/profiles/default/tsconfig.json",
"compilerOptions": {
"rootDir": "./src",
"outDir": "./lib",
"lib": ["esnext", "dom"]
}
}

View File

@ -656,5 +656,30 @@
"projectFolder": "models/chunter",
"shouldPublish": true
},
{
"packageName": "@anticrm/recruit",
"projectFolder": "plugins/recruit",
"shouldPublish": true
},
{
"packageName": "@anticrm/recruit-assets",
"projectFolder": "plugins/recruit-assets",
"shouldPublish": true
},
{
"packageName": "@anticrm/recruit-resources",
"projectFolder": "plugins/recruit-resources",
"shouldPublish": true
},
{
"packageName": "@anticrm/model-recruit",
"projectFolder": "models/recruit",
"shouldPublish": true
},
{
"packageName": "@anticrm/model-demo",
"projectFolder": "models/demo",
"shouldPublish": true
},
]
}