From 133a841e64b27b9c50152a55e536df06e2157ddc Mon Sep 17 00:00:00 2001 From: Pavel Zubkov Date: Sun, 28 May 2023 03:03:44 +0300 Subject: [PATCH] save --- cabinet/admin/admin.view.tree | 31 ++++++++++----------- cabinet/admin/admin.view.ts | 32 ++++++++++----------- cabinet/cabinet.view.css.ts | 13 --------- cabinet/cabinet.view.tree | 31 ++++++++++++++++----- cabinet/cabinet.view.ts | 34 +++++++++++++++++------ cabinet/norole/norole.view.css.ts | 24 +--------------- cabinet/norole/norole.view.tree | 46 ++++++++----------------------- cabinet/norole/norole.view.ts | 14 ++++++++-- cabinet/sign/sign.view.ts | 3 +- campaign/campaign.ts | 33 +++++++++++++++------- entity/entity.ts | 5 ++++ intern.view.tree | 5 ++-- intern.view.ts | 27 ++++++++---------- person/form/form.view.tree | 2 ++ person/person.ts | 12 +++----- 15 files changed, 152 insertions(+), 160 deletions(-) diff --git a/cabinet/admin/admin.view.tree b/cabinet/admin/admin.view.tree index 0630cb5..e15beae 100644 --- a/cabinet/admin/admin.view.tree +++ b/cabinet/admin/admin.view.tree @@ -1,16 +1,15 @@ $hyoo_intern_cabinet_admin $hyoo_intern_cabinet profile_title \Администратор - campaign $hyoo_intern_campaign + - campaign $hyoo_intern_campaign companies => companies managers => managers curators => curators mentors => mentors candidates_on_review => candidates_on_review spreads * - profile <= Profile - campaign <= Campaign $hyoo_intern_campaign_card + - campaign <= Campaign $hyoo_intern_campaign_card campaign <= campaign - curators <= Curators $hyoo_intern_catalog_curators + - curators <= Curators $hyoo_intern_catalog_curators entity_links <= curators menu_foot / <= Add_curator $mol_button_minor @@ -18,12 +17,12 @@ $hyoo_intern_cabinet_admin $hyoo_intern_cabinet click? <=> add_curator? null <= Add_curator_person $mol_string value? <=> add_curator_person_id? \ - resumes <= Resumes $hyoo_intern_catalog_interns + - resumes <= Resumes $hyoo_intern_catalog_interns menu_title \Заявки на стажировку (резюме) entity_links <= candidates_on_review - candidates <= Candidates $hyoo_intern_catalog_interns + - candidates <= Candidates $hyoo_intern_catalog_interns menu_title \Кандидаты - requested_invitations <= Requested_invitations $hyoo_intern_catalog_vacancies + - requested_invitations <= Requested_invitations $hyoo_intern_catalog_vacancies menu_title \Потребность в стажерах (приглашения) - (тз) Модуль «Потребность в стажерах» - должен позволять видеть заполненные заявки на стажеров от кадров, редактировать их, подтверждать публикацию в разделе «Приглашения». @@ -31,11 +30,11 @@ $hyoo_intern_cabinet_admin $hyoo_intern_cabinet - Заявки на стажеров отражаются в разделе «Приглашения», стажеры откликаются на них с помощью прохождения заданий. - Результаты откликов на заявки отражаются в личных кабинетах Кадров, а также у кураторов стажировки в административном блоке. - - мб оставить "подтвержденные" и "неподтвержденные" в одном разделе, сделав фильтр? - companies <= Companies $hyoo_intern_catalog_companies + - companies <= Companies $hyoo_intern_catalog_companies entity_links <= companies - managers <= Managers $hyoo_intern_catalog_managers + - managers <= Managers $hyoo_intern_catalog_managers entity_links <= managers - mentors <= Mentors $hyoo_intern_catalog_mentors + - mentors <= Mentors $hyoo_intern_catalog_mentors entity_links <= mentors menu_foot / <= Add_mentor $mol_button_minor @@ -43,21 +42,21 @@ $hyoo_intern_cabinet_admin $hyoo_intern_cabinet click? <=> add_mentor? null <= Add_mentor_person $mol_string value? <=> add_mentor_person_id? \ - vacancies <= Vacancies $hyoo_intern_catalog_vacancies - statistics <= Statistics $mol_page + - vacancies <= Vacancies $hyoo_intern_catalog_vacancies + - statistics <= Statistics $mol_page title \Статистика - (тз) Модуль «Статистика» – должен позволять автоматически сводить статистику по заявкам кандидатов, данным стажеров и заявкам на стажеров, давать прогнозирование статистических данных с помощью искусственного интеллекта. Статистика по заявкам кандидатов: 1. Количество откликов: всего, релевантных, нерелевантных 2. Возраст 3. Города 4. Вузы5. Образование 6. Статистика по опыту работы (необходимо продумать механику) 7. Направления стажировки 8. Каналы привлечения, по которым пришли кандидаты Статистика по заявкам на стажеров: 1. Количество заявок на стажеров в рамках комплексов Правительства Москвы.2. Количество заявок от органов власти и учреждений 3. Статистика по образованию 4. Статистика по задачам стажеров - timesheet <= Timesheet $mol_page + - timesheet <= Timesheet $mol_page title \Табель рабочего времени - (тз, доп) Модуль «Табель» – должен позволять видеть и выгружать табель учета рабочего времени стажеров, видеть статистику по количеству подтверждений табелей наставниками и кадрами. - (тз) Модуль «Школа наставников» - должен позволять видеть список наставников, которые прошли обучение в Школе наставников, а также видеть их прогресс обучения, статус получения сертификата, повторное прохождение и рейтинг по оценкам стажеров. - (тз, доп) Модуль «Заявления стажеров» – должен позволять отслеживать статус заявления на отпуск и увольнения стажера, автоматически интегрировать данные о согласованных заявлениях в табель стажеров - (тз, доп) Модуль «Рассылки» – должен позволять делать автоматические рассылки по почтам стажеров, наставникам и кадровым специалистам, а также внутри сайта направлять уведомления. - career_school <= Career_school $mol_page + - career_school <= Career_school $mol_page - (тз) Модуль «Карьерная школа» – должен позволять переводить на платформу с онлайн-треком Карьерной школы Правительства Москвы и telegram-канал. - Этап 2. Релевантные кандидаты в течении недели просматривают вебинары для знакомства со структурой Правительства Москвы, а также проходят образовательный онлайн-трек с конспектами, тестированиями и видеоэкскурсиями. title \Карьерная школа @@ -66,7 +65,7 @@ $hyoo_intern_cabinet_admin $hyoo_intern_cabinet value <= career_school_text \ \[Ссылка 1](https://talent.mos.ru) \[Ссылка 2](https://talent.mos.ru) - tests <= Tests $mol_page + - tests <= Tests $mol_page - (тз) Модуль «Тестирование» – должен позволять переводить на платформу для прохождения тестирования и сохранять результаты пройденного тестирования. - Этап 3. Тестирование Релевантные кандидаты проходят тестирование по русскому языку, анализу информации, компьютерной грамотности. title \Этап тестирования @@ -81,7 +80,7 @@ $hyoo_intern_cabinet_admin $hyoo_intern_cabinet \[Прохождение трека Word](https://talent.mos.ru) \[Прохождение трека Excel](https://talent.mos.ru) \[Прохождение трека PowerPoint](https://talent.mos.ru) - championship <= Championship $mol_page + - championship <= Championship $mol_page - Этап 4. Кейс-чемпионат 400 участников, прошедших отбор по итогам тестирования, делятся на команды и решают кейсы – реальные задачи от организаций Правительства Москвы, презентуя решения перед членами жюри. title \Кейс-чемпионат body / diff --git a/cabinet/admin/admin.view.ts b/cabinet/admin/admin.view.ts index 0c0ad47..197a9b9 100644 --- a/cabinet/admin/admin.view.ts +++ b/cabinet/admin/admin.view.ts @@ -2,23 +2,23 @@ namespace $.$$ { export class $hyoo_intern_cabinet_admin extends $.$hyoo_intern_cabinet_admin { - add_curator() { - const person_id = this.add_curator_person_id() - if (!$mol_int62_string_ensure( person_id )){ - $mol_fail( new $mol_data_error('person_id isnt int64_string') ) - } - const curator = this.campaign().curator_add( $mol_int62_string_ensure( person_id )! ) - return curator - } + // add_curator() { + // const person_id = this.add_curator_person_id() + // if (!$mol_int62_string_ensure( person_id )){ + // $mol_fail( new $mol_data_error('person_id isnt int64_string') ) + // } + // const curator = this.campaign().curator_add( $mol_int62_string_ensure( person_id )! ) + // return curator + // } - add_mentor() { - const person_id = this.add_mentor_person_id() - if (!$mol_int62_string_ensure( person_id )){ - $mol_fail( new $mol_data_error('person_id isnt int64_string') ) - } - const mentor = this.campaign().curator_add( $mol_int62_string_ensure( person_id )! ) - return mentor - } + // add_mentor() { + // const person_id = this.add_mentor_person_id() + // if (!$mol_int62_string_ensure( person_id )){ + // $mol_fail( new $mol_data_error('person_id isnt int64_string') ) + // } + // const mentor = this.campaign().curator_add( $mol_int62_string_ensure( person_id )! ) + // return mentor + // } } diff --git a/cabinet/cabinet.view.css.ts b/cabinet/cabinet.view.css.ts index 5fa9853..ed50f00 100644 --- a/cabinet/cabinet.view.css.ts +++ b/cabinet/cabinet.view.css.ts @@ -31,19 +31,6 @@ namespace $.$$ { gap: $mol_gap.block, }, }, - - Label: { - padding: $mol_gap.block, - }, - - Logo: { - width: '3rem', - height: '3rem', - }, - - Descr: { - color: $mol_theme.shade, - }, } ) diff --git a/cabinet/cabinet.view.tree b/cabinet/cabinet.view.tree index 3f90a05..411a361 100644 --- a/cabinet/cabinet.view.tree +++ b/cabinet/cabinet.view.tree @@ -1,12 +1,11 @@ $hyoo_intern_cabinet $mol_book2_catalog user $hyoo_intern_person - campaign_current => campaign_current + campaign $hyoo_intern_campaign yard $hyoo_sync_client Placeholder null - role* null menu_tools / <= User $mol_link - uri <= uri*person + arg * section \person sub / <= User_icon $mol_icon_account hint \Учетная запись Menu_logo $hyoo_intern_person_avatar @@ -21,11 +20,29 @@ $hyoo_intern_cabinet $mol_book2_catalog <= Online $hyoo_sync_online yard <= yard param \section - Menu_link*0 $mol_link - uri <= uri* \ - sub <= menu_link_content* Person_page $hyoo_intern_person_page person <= user - Confirm_page $hyoo_intern_confirm + - Confirm_page $hyoo_intern_confirm campaign <= campaign_current yard <= yard + Staff_request_page $mol_page + title \Заявка сотрудника + body / + <= Staff_request_list $mol_list rows / + <= Person_form $hyoo_intern_person_form + person <= user + <= Role_select_field $mol_form_field + name \Выберите вашу роль + bid \* + control <= Role_select_control $mol_switch + value? <=> staff_request_role? \ + options * + curator \Куратор + manager \Кадровый специалист + mentor \Наставник + <= Staff_link_field $mol_form_field + name \Передайте эту ссылку администратору, вы увидите личный кабинет когда администратор подтвердит заявку + control <= Staff_link_copy $mol_button_copy + enabled <= staff_link_copy_enabled false + text <= staff_request_link \ + title \Копировать ссылку diff --git a/cabinet/cabinet.view.ts b/cabinet/cabinet.view.ts index d843441..7f4aa74 100644 --- a/cabinet/cabinet.view.ts +++ b/cabinet/cabinet.view.ts @@ -2,31 +2,47 @@ namespace $.$$ { export class $hyoo_intern_cabinet extends $.$hyoo_intern_cabinet { + @ $mol_mem + campaign() { + return this.user().campaign_current()! + } + @ $mol_mem Spread() { + if (this.campaign().person_wants_to_staff( this.user() )) return this.Staff_request_page() + if ( !this.spread() ) this.spread( Object.keys(this.spreads())[0] ) + return { person: this.Person_page(), - confirm: this.Confirm_page(), + // confirm: this.Confirm_page(), ...this.spreads(), - }[ this.spread() ]! as any - } - - uri( spread: string ) { - return this.$.$mol_state_arg.make_link( this.arg( spread ) ) + }[ this.spread() ]! } Menu_logo() { - return this.campaign_current()?.image_node()?.list()?.length ?? 0 > 0 ? super.Menu_logo() : null as any + return this.campaign()?.image_node()?.list()?.length ?? 0 > 0 ? super.Menu_logo() : null as any } @ $mol_mem campaign_image_node() { - return this.campaign_current()?.image_node() ?? new $hyoo_crowd_blob + return this.campaign()?.image_node() ?? new $hyoo_crowd_blob } campaign_name() { - return this.campaign_current()?.name() || super.campaign_name() + return this.campaign()?.name() || super.campaign_name() + } + + staff_request_role( next?: string ) { + return this.$.$mol_state_local.value(`${this}.staff_request_role()`, next) ?? super.staff_request_role() + } + + staff_link_copy_enabled() { + return !!this.staff_request_role() && !!this.user().name() && !!this.user().name_family() + } + + staff_request_link() { + return this.$.$mol_state_arg.make_link({ section: 'staff_approve', person: this.user().id(), campaign: this.campaign().id(), role: this.staff_request_role() }) } } diff --git a/cabinet/norole/norole.view.css.ts b/cabinet/norole/norole.view.css.ts index d390329..1df702b 100644 --- a/cabinet/norole/norole.view.css.ts +++ b/cabinet/norole/norole.view.css.ts @@ -2,30 +2,8 @@ namespace $.$$ { $mol_style_define( $.$hyoo_intern_cabinet_norole, { - Info: $hyoo_intern_cabinet_page_style, + Info_page: $hyoo_intern_cabinet_page_style, Resume_page: $hyoo_intern_cabinet_page_style, - Sign: $hyoo_intern_cabinet_page_style, - - Resume_link: { - width: '20rem', - flex: { - grow: 0, - }, - alignSelf: 'center', - justifyContent: 'center', - }, - - Send_resume: { - width: '20rem', - flex: { - grow: 0, - }, - alignSelf: 'center', - justifyContent: 'center', - margin: { - bottom: $mol_gap.block, - }, - }, } ) diff --git a/cabinet/norole/norole.view.tree b/cabinet/norole/norole.view.tree index 23eb8cc..e0b94eb 100644 --- a/cabinet/norole/norole.view.tree +++ b/cabinet/norole/norole.view.tree @@ -1,46 +1,24 @@ $hyoo_intern_cabinet_norole $hyoo_intern_cabinet + campaign_join $hyoo_intern_campaign + menu_tools / spreads * - info <= Info $mol_page + info <= Info_page $mol_page title \Информация для кандидатов body / <= Info_text $mol_text - text <= info_text \a - \# Стажировка в Правительстве Москвы - \Прямо сейчас ты делаешь свой первый шаг на пути к карьере в Правительстве Москвы — участвуешь в отборе на стажировку, которая пройдет с 1 августа 2023 года по 31 января 2024 года. **Мы ждем твою заявку до 17 апреля.** - \Стать стажерами Правительства Москвы могут студенты бакалавриата или специалитета, обучающиеся на последнем курсе, магистранты и выпускники вузов, получившие первое образование с 2016 по 2022 год. - \**Чтобы начать заполнение заявки, перейди по ссылке ниже. Внимательно проверь, правильно ли введены все данные и особенно адрес электронной почты — на него в течение двух недель после подачи заявки придет информация о твоих следующих шагах.** - \Анкета — это начало нашего знакомства. Мы хотим узнать о твоем образовании, опыте работы, если он есть, увлечениях или внеучебной деятельности, о навыках, которые ты приобрел во время учебы. Обязательно заполни анкету полностью перед подачей заявки — мы не сможем увидеть изменения, внесенные после отклика. - \Желаем удачи! - <= Resume_link $mol_button_major - title \Перейти к заполнению заявки - click? <=> open_resume? null - resume_page <= Resume_page $mol_page + text <= campaign_info \ + <= Actions $mol_row sub / + <= Resume_link $mol_button_major + title \Заполнить заявку + click? <=> spread*resume? + <= Im_staff $mol_button_minor + title \Я сотрудник + click? <=> staff_request? null + resume <= Resume_page $mol_page title \Заполнить заявку body / <= Resume $hyoo_intern_resume_card person <= user <= Send_resume $mol_button_major - - (тз) Модуль «Подать заявку» – должен позволять отправлять заявку на участие в отборе на стажировку, видеть статус заявки на стажировку: отказ в прохождении на стажировку, прохождение на следующий этап отбора, прохождение на стажировку. title \Подать заявку click? <=> send_resume? null - - <= Send_notify $mol_paragraph - title \Заявка подана, ответное письмо будет отправлено на твою электронную почту - sign <= Sign $mol_page - title \Вход в личный кабинет - body / - <= Sign_info $mol_text - text \ - \Твой аккаунт будет автоматически привязан к браузеру на этом устройстве. - \Перейти в личный кабинет: - <= Open_intern $mol_button_minor - title \Стажера - click <= role*intern - <= Open_curator $mol_button_minor - title \Куратора - click <= role*curator - <= Open_mentor $mol_button_minor - title \Наставника - click <= role*mentor - <= Open_manager $mol_button_minor - title \Специалиста отдела кадров - click <= role*manager diff --git a/cabinet/norole/norole.view.ts b/cabinet/norole/norole.view.ts index 826890b..1a04638 100644 --- a/cabinet/norole/norole.view.ts +++ b/cabinet/norole/norole.view.ts @@ -2,14 +2,22 @@ namespace $.$$ { export class $hyoo_intern_cabinet_norole extends $.$hyoo_intern_cabinet_norole { + campaign() { + return this.campaign_join() ?? this.user().campaign_current() + } + + campaign_info() { + return this.campaign().info() + } + @ $mol_action send_resume() { this.campaign().candidates_on_review().item_push( this.user() ) - this.role( 'intern' ) } - open_resume() { - this.spread( 'resume_page' ) + @ $mol_action + staff_request() { + this.user().campaigns().item_push( this.campaign() ) } } diff --git a/cabinet/sign/sign.view.ts b/cabinet/sign/sign.view.ts index bb350b2..de6ffb0 100644 --- a/cabinet/sign/sign.view.ts +++ b/cabinet/sign/sign.view.ts @@ -24,8 +24,7 @@ namespace $.$$ { @ $mol_action campaign_add() { - const obj = this.person().campaign_add() - this.person().campaign_current( obj ) + this.person().campaigns().item_make() } @ $mol_action diff --git a/campaign/campaign.ts b/campaign/campaign.ts index 5db51cf..e3ac652 100644 --- a/campaign/campaign.ts +++ b/campaign/campaign.ts @@ -1,5 +1,10 @@ namespace $ { + export interface $hyoo_intern_campaign_staff { + person: $hyoo_intern_person + role: 'curator' | 'manager' | 'mentor' + } + export class $hyoo_intern_campaign extends $hyoo_crowd_struct { id() { @@ -36,12 +41,12 @@ namespace $ { } @ $mol_mem - candidates_on_review(){ - const node = this.sub('candidates_on_review', $hyoo_intern_entity_links) + managers() { + const node = this.sub('managers', $hyoo_intern_entity_links) node.Item = $hyoo_intern_person return node } - + @ $mol_mem mentors() { const node = this.sub('mentors', $hyoo_intern_entity_links) @@ -49,20 +54,28 @@ namespace $ { return node } + person_is_staff_member(person: $hyoo_intern_person) { + return this.curators().item_has(person) || this.managers().item_has(person) || this.mentors().item_has(person) || person.id() === this.owner()?.id() + } + + person_wants_to_staff(person: $hyoo_intern_person) { + return person.campaigns().item_has( this ) && !this.person_is_staff_member(person) + } + @ $mol_mem - companies() { - const node = this.sub('companies', $hyoo_intern_entity_links) - node.Item = $hyoo_intern_company + candidates_on_review(){ + const node = this.sub('candidates_on_review', $hyoo_intern_entity_links) + node.Item = $hyoo_intern_person return node } @ $mol_mem - managers() { - const node = this.sub('managers', $hyoo_intern_entity_links) - node.Item = $hyoo_intern_manager + companies() { + const node = this.sub('companies', $hyoo_intern_entity_links) + node.Item = $hyoo_intern_company return node } - + @ $mol_action curator_add( person_id: $mol_int62_string ){ // const person = this.world()!.Fund( $hyoo_intern_person ).Item( person_id ) diff --git a/entity/entity.ts b/entity/entity.ts index 80d7737..37f45b9 100644 --- a/entity/entity.ts +++ b/entity/entity.ts @@ -49,6 +49,11 @@ namespace $ { this.drop( obj.land.id() ) } + @ $mol_mem_key + item_has( obj: InstanceType ) { + return this.has(obj.id()) + } + } } diff --git a/intern.view.tree b/intern.view.tree index 6f3edea..b4a11bb 100644 --- a/intern.view.tree +++ b/intern.view.tree @@ -2,7 +2,7 @@ $hyoo_intern $mol_book2 plugins / <= Theme $mol_theme_auto user $hyoo_intern_person - campaign $hyoo_intern_campaign + campaign_join null yard $hyoo_sync_client Person_page $hyoo_intern_person_page role? \sign @@ -13,11 +13,10 @@ $hyoo_intern $mol_book2 norole <= Norole_cabinet $hyoo_intern_cabinet_norole yard <= yard user <= user - campaign <= campaign + campaign_join <= campaign_join admin <= Admin_cabinet $hyoo_intern_cabinet_admin yard <= yard user <= user - campaign <= campaign curator <= Curator_cabinet $hyoo_intern_cabinet_curator yard <= yard user <= user diff --git a/intern.view.ts b/intern.view.ts index 19317e2..56a2df2 100644 --- a/intern.view.ts +++ b/intern.view.ts @@ -15,32 +15,27 @@ namespace $.$$ { } @ $mol_mem - campaign_arg() { - const str = this.$.$mol_state_arg.value('campaign') + campaign_join() { + const str = this.$.$mol_state_arg.value('campaign_join') const id = $mol_int62_string_ensure( str ) return id ? this.home().world()?.Fund( $hyoo_intern_campaign ).Item(id) : null } @ $mol_mem role() { - if (!this.campaign_arg()) { + // В ссылке есть id кампании в которую входим и пользователь не проходил 'sign' - пришел новый кандидат или новый сотрудник + if (this.campaign_join() && !this.user().signed()) return 'norole' - if (!this.user().signed()) return 'sign' + // В ссылке нет id кампании в которую входим и пользователь не проходил 'sign' - создаем кампанию + if (!this.campaign_join() && !this.user().signed()) return 'sign' - // После прохождения sign текущая кампания всегда есть, можно переключиться только на другую кампанию - // Первая кампания включается на этапе sign - // Также кампании нельзя удалить, только перевести в стадию закрыта + // Заходим в текущую кампанию, пользователь админ + if (this.user().campaign_current()?.owner()?.id() === this.user().id()) return 'admin' - if (this.user().campaign_current()?.owner()?.id() === this.user().id()) return 'admin' - - return 'qwe' - - } else { - - return 'norole' - - } + // Пользователь ждет аппрува на присоединение в качестве сотрудника + if (this.user().campaign_current()?.person_wants_to_staff( this.user() )) return 'norole' + return 'qwe' } sub() { diff --git a/person/form/form.view.tree b/person/form/form.view.tree index f94a6bd..24023c6 100644 --- a/person/form/form.view.tree +++ b/person/form/form.view.tree @@ -19,10 +19,12 @@ $hyoo_intern_person_form $mol_form <= Name_group $mol_form_group sub / <= Name_field $mol_form_field name \Имя + bid \* control <= Name_control $mol_string value? <=> name? <= Name_family_field $mol_form_field name \Фамилия + bid \* control <= Name_family_control $mol_string value? <=> name_family? <= Contact_group $mol_form_group sub / diff --git a/person/person.ts b/person/person.ts index 310894d..73d65af 100644 --- a/person/person.ts +++ b/person/person.ts @@ -65,18 +65,14 @@ namespace $ { return node } - @ $mol_action - campaign_add() { - const obj = this.campaigns().item_make() - obj.owner( this ) - return obj - } - @ $mol_mem campaign_current(next?: $hyoo_intern_campaign) { const str = this.data().sub('campaign_current', $hyoo_crowd_reg).str( next && next.id() ) const id = $mol_int62_string_ensure(str) - return id ? this.world()?.Fund($hyoo_intern_campaign).Item(id) : null + + if (id) return this.world()?.Fund($hyoo_intern_campaign).Item(id) + + return this.campaigns().items()[0] ?? null } }