From 8530a237072242ed172580d398c4ef56f11bc13b Mon Sep 17 00:00:00 2001 From: wangshiming Date: Mon, 29 Nov 2021 15:10:39 +0800 Subject: [PATCH 0001/1600] =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E4=B8=AD=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .husky/.gitignore | 1 + .../pro/components/user/user.component.html | 2 +- .../routes/account/account-routing.module.ts | 31 +++ src/app/routes/account/account.module.ts | 29 +++ .../components/center/center.component.html | 131 +++++++++++ .../components/center/center.component.less | 46 ++++ .../center/center.component.spec.ts | 23 ++ .../components/center/center.component.ts | 211 +++++++++++++++++ .../edit-info/edit-info.component.html | 15 ++ .../edit-info/edit-info.component.less | 6 + .../edit-info/edit-info.component.spec.ts | 23 ++ .../edit-info/edit-info.component.ts | 207 +++++++++++++++++ .../edit-name/edit-name.component.html | 31 +++ .../edit-name/edit-name.component.less | 11 + .../edit-name/edit-name.component.spec.ts | 31 +++ .../edit-name/edit-name.component.ts | 216 ++++++++++++++++++ .../edit-password.component.html | 78 +++++++ .../edit-password/edit-password.component.ts | 97 ++++++++ .../account/services/account.service.ts | 61 +++++ src/app/routes/routes-routing.module.ts | 14 +- src/app/shared/index.ts | 9 + src/app/shared/shared-delon.module.ts | 3 +- src/app/shared/shared-zorro.module.ts | 12 + 23 files changed, 1285 insertions(+), 3 deletions(-) create mode 100644 .husky/.gitignore create mode 100644 src/app/routes/account/account-routing.module.ts create mode 100644 src/app/routes/account/account.module.ts create mode 100644 src/app/routes/account/components/center/center.component.html create mode 100644 src/app/routes/account/components/center/center.component.less create mode 100644 src/app/routes/account/components/center/center.component.spec.ts create mode 100644 src/app/routes/account/components/center/center.component.ts create mode 100644 src/app/routes/account/components/edit-info/edit-info.component.html create mode 100644 src/app/routes/account/components/edit-info/edit-info.component.less create mode 100644 src/app/routes/account/components/edit-info/edit-info.component.spec.ts create mode 100644 src/app/routes/account/components/edit-info/edit-info.component.ts create mode 100644 src/app/routes/account/components/edit-name/edit-name.component.html create mode 100644 src/app/routes/account/components/edit-name/edit-name.component.less create mode 100644 src/app/routes/account/components/edit-name/edit-name.component.spec.ts create mode 100644 src/app/routes/account/components/edit-name/edit-name.component.ts create mode 100644 src/app/routes/account/components/edit-password/edit-password.component.html create mode 100644 src/app/routes/account/components/edit-password/edit-password.component.ts create mode 100644 src/app/routes/account/services/account.service.ts diff --git a/.husky/.gitignore b/.husky/.gitignore new file mode 100644 index 00000000..31354ec1 --- /dev/null +++ b/.husky/.gitignore @@ -0,0 +1 @@ +_ diff --git a/src/app/layout/pro/components/user/user.component.html b/src/app/layout/pro/components/user/user.component.html index ece6ea2f..ed7633c0 100644 --- a/src/app/layout/pro/components/user/user.component.html +++ b/src/app/layout/pro/components/user/user.component.html @@ -4,7 +4,7 @@
-
+
个人中心
diff --git a/src/app/routes/account/account-routing.module.ts b/src/app/routes/account/account-routing.module.ts new file mode 100644 index 00000000..c6412c83 --- /dev/null +++ b/src/app/routes/account/account-routing.module.ts @@ -0,0 +1,31 @@ +/* + * @Author: your name + * @Date: 2021-11-29 11:06:01 + * @LastEditTime: 2021-11-29 14:21:56 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\account\account-routing.module.ts + */ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { AccountComponentsCenterComponent } from './components/center/center.component'; +import { AccountComponentsEditInfoComponent } from './components/edit-info/edit-info.component'; + +const routes: Routes = [ + { path: '', redirectTo: 'center', pathMatch: 'full' }, + { + path: 'center', + component: AccountComponentsCenterComponent, + data: { + title: '账户中心', + titleI18n: 'app.my.center', + }, + }, + { path: 'editInfo', component: AccountComponentsEditInfoComponent }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class AccountRoutingModule {} diff --git a/src/app/routes/account/account.module.ts b/src/app/routes/account/account.module.ts new file mode 100644 index 00000000..5bfacc1a --- /dev/null +++ b/src/app/routes/account/account.module.ts @@ -0,0 +1,29 @@ +/* + * @Author: your name + * @Date: 2021-11-29 11:06:01 + * @LastEditTime: 2021-11-29 15:04:25 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\account\account.module.ts + */ +import { NgModule } from '@angular/core'; +import { SharedModule } from '@shared'; +import { AccountRoutingModule } from './account-routing.module'; +import { AccountComponentsCenterComponent } from './components/center/center.component'; +import { AccountComponentsEditInfoComponent } from './components/edit-info/edit-info.component'; +import { AccountComponentsEditNameComponent } from './components/edit-name/edit-name.component'; +import { AccountComponentsCenterEditComponent } from './components/edit-password/edit-password.component'; + +const COMPONENTS = [ + AccountComponentsCenterComponent, + AccountComponentsEditNameComponent, + AccountComponentsEditInfoComponent, + AccountComponentsCenterEditComponent +]; +const COMPONENTS_NOROUNT = [AccountComponentsEditNameComponent]; + +@NgModule({ + imports: [SharedModule, AccountRoutingModule], + declarations: [...COMPONENTS, ...COMPONENTS_NOROUNT], +}) +export class AccountModule {} diff --git a/src/app/routes/account/components/center/center.component.html b/src/app/routes/account/components/center/center.component.html new file mode 100644 index 00000000..a48faeea --- /dev/null +++ b/src/app/routes/account/components/center/center.component.html @@ -0,0 +1,131 @@ +
+ + +

个人中心

+ + + + +
+
+ 手机号码/账号 +
+
{{ infoData.phone }}
+
+ 已绑定 + 未绑定 +
+
+
+
+ +
+ + + +
+
+ 账户密码 +
+
定期更换密码有助于账号安全
+
+ 已设置 + 未设置 +
+
+
+
+ +
+
+ +
+
diff --git a/src/app/routes/account/components/center/center.component.less b/src/app/routes/account/components/center/center.component.less new file mode 100644 index 00000000..96f8b59c --- /dev/null +++ b/src/app/routes/account/components/center/center.component.less @@ -0,0 +1,46 @@ +:host { + ::ng-deep { + .info-main { + padding: 30px; + } + .info-main h3 { + margin-bottom: 30px; + color: #333; + font-size: 24px; + } + .info { + position: relative; + } + .info-btn { + position: absolute; + top: 20px; + right: 20px; + } + .item-btn { + width: 28px; + text-align: center; + } + .li-label { + color: #333; + font-weight: bold; + font-size: 14px; + } + page-grid { + background-color: #f0f3f7; + + div.container { + width: 80%; + margin: 0 auto; + padding: 1rem; + } + } + } + .info-row { + padding: 24px 0; + .info-icon { + margin-right: 15px; + color: #3875fb; + font-size: 16px; + } + } +} diff --git a/src/app/routes/account/components/center/center.component.spec.ts b/src/app/routes/account/components/center/center.component.spec.ts new file mode 100644 index 00000000..cdcb358d --- /dev/null +++ b/src/app/routes/account/components/center/center.component.spec.ts @@ -0,0 +1,23 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { AccountComponentsCenterComponent } from './center.component'; + +describe('AccountComponentsCenterComponent', () => { + let component: AccountComponentsCenterComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [AccountComponentsCenterComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AccountComponentsCenterComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/account/components/center/center.component.ts b/src/app/routes/account/components/center/center.component.ts new file mode 100644 index 00000000..2115d11b --- /dev/null +++ b/src/app/routes/account/components/center/center.component.ts @@ -0,0 +1,211 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { SFComponent, SFSchema, SFSelectWidgetSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { Observable, Observer } from 'rxjs'; +import { AccountService } from '../../services/account.service'; +import { AccountComponentsEditNameComponent } from '../edit-name/edit-name.component'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { AccountComponentsCenterEditComponent } from '../edit-password/edit-password.component'; + +@Component({ + selector: 'app-account-components-center', + templateUrl: './center.component.html', + styleUrls: ['./center.component.less'], +}) +export class AccountComponentsCenterComponent implements OnInit { + url = `/rule?_allow_anonymous=true`; + @ViewChild('sf', { static: false }) sf!: SFComponent; + i: any; + formDate: any = {}; + schema!: SFSchema; + ui: SFUISchema = {}; + infoData: any = { + appId: '', + appTypeId: 0, + appTypeName: '', + appUserId: 0, + avatar: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png?_allow_anonymous=true', + birthday: '', + cert: 0, + createTime: '', + email: '', + id: 0, + isPwd: true, + lastLoginDate: '', + name: '', + nickName: '', + openId: '', + phone: '', + remark: '', + sex: 0, + state: 0, + stateLocked: true, + token: '', + userType: 0, + }; + tabs = [ + { + name: '基本设置', + }, + { + name: '安全设置', + }, + ]; + idx: any = 0; + constructor(public service: AccountService, private modal: ModalHelper, private http: _HttpClient, private router: Router, private modalService: NzModalService,) {} + + ngOnInit() { + this.initSF(); + this.getInfo(); + } + initSF() { + this.schema = { + properties: { + avatar: { + type: 'string', + title: '头像', + ui: { + action: `/cms/upload/multipartFile/fileModel?_allow_anonymous=true`, + fileType: 'image/png,image/jpeg,image/jpg,image/png,image/gif,image/bmp', + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '支持JPG、GIF、PNG、JPEG、BMP格式,文件小于2M', + data: { + // appId: environment.appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args: any) => { + if (args.type === 'success') { + const avatar = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: args.fileList[0].response.url, + response: { + url: args.fileList[0].response.url, + }, + }, + ]; + this.sf?.setValue('/avatar', avatar); + } + }, + beforeUpload: (file: any, _fileList) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 2; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过2M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + }, + } as SFUploadWidgetSchema, + }, + nickName: { + title: '昵称', + type: 'string', + minLength: 1, + maxLength: 18, + ui: { + placeholder: '请输入昵称', + width: 400, + errors: { + required: '请输入昵称', + }, + }, + }, + }, + required: ['nickName', 'avatar'], + }; + this.ui = { + '*': { + spanLabel: 5, + grid: { span: 24 }, + }, + }; + } + getInfo() { + const params = { + // id: this.i.id, + }; + // this.service.http.post(this.service.$api_getUserInfo, params).subscribe((res) => { + // this.infoData = res.data; + // this.infoData.avatar = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.avatar, + // response: { + // url: res.data.avatar, + // }, + // }, + // ]; + // }); + } + + edit(tpye: string) { + if (tpye === 'phone') { + const modalRef = this.modalService.create({ + nzTitle: '修改用户名', + nzContent: AccountComponentsEditNameComponent, + nzComponentParams: { }, + }); + modalRef.afterClose.subscribe((result: any) => { + if (result === true) { + // this.st.load(1); + } + }); + } + if (tpye === 'password') { + + const modalRef = this.modalService.create({ + nzTitle: '设置/修改登录密码', + nzContent: AccountComponentsCenterEditComponent, + nzComponentParams: { }, + }); + modalRef.afterClose.subscribe((result: any) => { + if (result === true) { + // this.st.load(1); + } + }); + } + // if (tpye === 'info') { + // this.router.navigate(['/account/editInfo'], { + // queryParams: { realName: this.infoData.realName, certificateNumber: this.infoData.certificateNumber }, + // }); + // } + // if (tpye === 'name') { + // this.modal + // .createStatic(AccountComponentsEditNameComponent, { i: { name: this.infoData.name, phone: this.infoData.phone } }) + // .subscribe(() => { + // this.getInfo(); + // // this.st.reload(); + // }); + // } + } + + changeType(type: number): void { + this.idx = type; + } + + formSubmit(value: any): void { + const params = { ...value }; + this.service.request(`${this.service.$api_updateUserInfo}`, params).subscribe((res) => { + if (res === true) { + this.service.msgSrv.success('保存成功'); + this.getInfo(); + // this.initSF(); + } + }); + } +} diff --git a/src/app/routes/account/components/edit-info/edit-info.component.html b/src/app/routes/account/components/edit-info/edit-info.component.html new file mode 100644 index 00000000..d40f4edc --- /dev/null +++ b/src/app/routes/account/components/edit-info/edit-info.component.html @@ -0,0 +1,15 @@ +
+ +
+ +
+ + + + + + +
+
+
+
diff --git a/src/app/routes/account/components/edit-info/edit-info.component.less b/src/app/routes/account/components/edit-info/edit-info.component.less new file mode 100644 index 00000000..9711336e --- /dev/null +++ b/src/app/routes/account/components/edit-info/edit-info.component.less @@ -0,0 +1,6 @@ +:host { + .myForm { + width: 600px; + margin: 5rem auto; + } +} diff --git a/src/app/routes/account/components/edit-info/edit-info.component.spec.ts b/src/app/routes/account/components/edit-info/edit-info.component.spec.ts new file mode 100644 index 00000000..a8f871cb --- /dev/null +++ b/src/app/routes/account/components/edit-info/edit-info.component.spec.ts @@ -0,0 +1,23 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { OfficialWebsiteComponentsMemberEditInfoComponent } from './edit-info.component'; + +describe('OfficialWebsiteComponentsMemberEditInfoComponent', () => { + let component: OfficialWebsiteComponentsMemberEditInfoComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [OfficialWebsiteComponentsMemberEditInfoComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OfficialWebsiteComponentsMemberEditInfoComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/account/components/edit-info/edit-info.component.ts b/src/app/routes/account/components/edit-info/edit-info.component.ts new file mode 100644 index 00000000..45b0121c --- /dev/null +++ b/src/app/routes/account/components/edit-info/edit-info.component.ts @@ -0,0 +1,207 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { SFComponent, SFSchema, SFSelectWidgetSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { environment } from '@env/environment'; +import { Observable, Observer } from 'rxjs'; +import { AccountService } from '../../services/account.service'; + +@Component({ + selector: 'app-account-components-edit-info', + templateUrl: './edit-info.component.html', + styleUrls: ['./edit-info.component.less'], +}) +export class AccountComponentsEditInfoComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + i: any; + schema!: SFSchema; + ui!: SFUISchema; + formData: any = { + // avatar:[ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png', + // response: { + // url: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png', + // }, + // }, + // ], + // name:'西四' + }; + + constructor(public service: AccountService, private modal: ModalHelper, private route: ActivatedRoute) { + const { realName, identity } = route.snapshot?.queryParams; + Object.assign(this.formData, { realName, certificateNumber: identity }); + } + + ngOnInit() { + this.initSF(); + this.getInfo(); + } + initSF() { + this.schema = { + properties: { + avatar: { + type: 'string', + title: '头像', + ui: { + // action: environment.UPLOAD_URL, + fileType: 'image/png,image/jpeg,image/jpg,image/png,image/gif,image/bmp', + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '支持JPG、GIF、PNG、JPEG、BMP格式,文件小于2M', + data: { + // appId: environment.appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + const avatar = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: args.fileList[0].response.url, + response: { + url: args.fileList[0].response.url, + }, + }, + ]; + this.sf?.setValue('/avatar', avatar); + } + }, + beforeUpload: (file: any, _fileList) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 2; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过2M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + }, + } as SFUploadWidgetSchema, + }, + name: { + title: '用户名', + type: 'string', + ui: { + widget: 'text', + }, + }, + phone: { + title: '手机号', + type: 'string', + ui: { + widget: 'text', + }, + }, + nickName: { + title: '昵称', + type: 'string', + minLength: 1, + maxLength: 18, + ui: { + placeholder: '请输入昵称', + errors: { + required: '请输入昵称', + }, + }, + }, + sex: { + title: '性别', + type: 'string', + default: 0, + enum: [ + { label: '未知', value: 0 }, + { label: '男', value: 1 }, + { label: '女', value: 2 }, + { label: '保密', value: 3 }, + ], + ui: { + widget: 'select', + } as SFSelectWidgetSchema, + }, + birthday: { + title: '生日', + type: 'string', + format: 'date', + }, + realName: { + title: '真实姓名', + type: 'string', + ui: { + widget: 'text', + optionalHelp: '实名认证渠道来自供应商入驻,仅在用户同意的情况下,合理用于相关业务,且平台有义务保障您的信息安全。', + }, + }, + certificateNumber: { + title: '身份证号码', + type: 'string', + ui: { + widget: 'text', + }, + }, + }, + required: ['nickName', 'sex', 'avatar'], + }; + this.ui = { + '*': { + spanLabel: 5, + grid: { span: 24 }, + }, + }; + } + getInfo() { + const params = { + // id: this.i.id, + }; + // this.service.http.post(this.service.$api_get_current_user_detail, params).subscribe((res) => { + // this.formData = res.data; + // if (!res.data.birthday) { + // this.formData.birthday = Date; + // } + // this.formData.avatar = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.avatar, + // response: { + // url: res.data.avatar, + // }, + // }, + // ]; + // this.formData.realName = this.route.snapshot.queryParams.realName; + // // this.formData.phone = this.route.snapshot.queryParams.phone; + // this.formData.certificateNumber = this.route.snapshot.queryParams.certificateNumber; + // this.initSF(); + // }); + } + formSubmit() { + const params: any = { + ...this.sf.value, + }; + delete params.realName; + delete params.certificateNumber; + // this.service.http.post(this.service.$api_updateUserInfo, params).subscribe((res) => { + // if (res.data) { + // this.service.msgSrv.success('修改成功'); + // this.goBack(); + // } + // }); + } + goBack() { + history.go(-1); + } +} diff --git a/src/app/routes/account/components/edit-name/edit-name.component.html b/src/app/routes/account/components/edit-name/edit-name.component.html new file mode 100644 index 00000000..ce2ccf04 --- /dev/null +++ b/src/app/routes/account/components/edit-name/edit-name.component.html @@ -0,0 +1,31 @@ + + + +
+ + +
+
+
+ + + diff --git a/src/app/routes/account/components/edit-name/edit-name.component.less b/src/app/routes/account/components/edit-name/edit-name.component.less new file mode 100644 index 00000000..4d054d96 --- /dev/null +++ b/src/app/routes/account/components/edit-name/edit-name.component.less @@ -0,0 +1,11 @@ +:host { + .valid-code { + position: relative; + } + .btn-code { + position: absolute; + right: 0; + top: 0; + z-index: 9; + } +} diff --git a/src/app/routes/account/components/edit-name/edit-name.component.spec.ts b/src/app/routes/account/components/edit-name/edit-name.component.spec.ts new file mode 100644 index 00000000..928e52ed --- /dev/null +++ b/src/app/routes/account/components/edit-name/edit-name.component.spec.ts @@ -0,0 +1,31 @@ +/* + * @Author: your name + * @Date: 2021-11-29 11:06:01 + * @LastEditTime: 2021-11-29 11:08:35 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\account\components\edit-name\edit-name.component.spec.ts + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { AccountComponentsEditNameComponent } from './edit-name.component'; + +describe('AccountComponentsEditNameComponent', () => { + let component: AccountComponentsEditNameComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [AccountComponentsEditNameComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AccountComponentsEditNameComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/account/components/edit-name/edit-name.component.ts b/src/app/routes/account/components/edit-name/edit-name.component.ts new file mode 100644 index 00000000..14e9686f --- /dev/null +++ b/src/app/routes/account/components/edit-name/edit-name.component.ts @@ -0,0 +1,216 @@ +import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core'; +import { ErrorData, SFComponent, SFSchema, SFStringWidgetSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +// import { CaptchaComponent } from '@shared'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { Observable, Observer } from 'rxjs'; +import { AccountService } from '../../services/account.service'; + +@Component({ + selector: 'app-account-components-edit-name', + templateUrl: './edit-name.component.html', + styleUrls: ['./edit-name.component.less'], +}) +export class AccountComponentsEditNameComponent implements OnInit, AfterViewInit { + // @ViewChild('dun', { static: false }) + // private dun!: CaptchaComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + record: any = {}; + i: any; + schema!: SFSchema; + ui!: SFUISchema; + + formData: any = {}; + count = 0; + oldName: any; + codeTips: any; + interval$: any; + + constructor(private modal: NzModalRef, public msgSrv: NzMessageService, public http: _HttpClient, public service: AccountService) {} + ngAfterViewInit(): void { + // this.dun.init(); + } + + ngOnInit() { + this.codeTips = '为了账户安全,需您的手机验证(' + this.i.phone + ')'; + this.formData.oldName = this.i.name; + this.initSF(); + // this.getInfo(); + } + initSF() { + this.schema = { + properties: { + oldName: { + title: '用户名(旧)', + type: 'string', + default: this.formData.oldName, + ui: { + widget: 'text', + }, + }, + userName: { + title: '用户名(新)', + type: 'string', + minLength: 3, + maxLength: 30, + description: '3-30个字符,支持中英文、数字、符号“_”和“-”,只能修改一次', + ui: { + placeholder: '请输入新用户名', + errors: { + required: '请输入新用户名', + }, + // validator: (val) => this.validatecomponent(val), + // blur: () => this.checkUserName(), + // validator: (val) => { + // const name = this.sf?.getValue('/oldName'); + // if (name === val) { + // return [{ keyword: 'validateName', message: '新用户名不能与旧用户名一样' }]; + // } + // // console.log(this.isCheck,'this.isCheck'); + // // if (!this.isCheck) { + // // return [{ keyword: 'validateName', message: '用户名已存在,请修改' }]; + // // } + // }, + } as SFStringWidgetSchema, + }, + smsVerifyCode: { + title: '验证码', + type: 'string', + maxLength: 6, + minLength: 6, + description: this.codeTips, + ui: { + widget: 'custom', + placeholder: '请输入验证码', + errors: { + required: '请输入6位验证码', + minLength: '请输入6位验证码', + }, + }, + }, + }, + required: ['userName', 'smsVerifyCode'], + }; + this.ui = { + '*': { + spanLabelFixed: 100, + grid: { span: 24 }, + }, + }; + } + + getCaptcha() { + const params = { + // phoneNumber: phone + }; + this.service.request(this.service.$api_get_msg_code, params, 'POST', true, 'FORM').subscribe((res) => { + console.log(res); + // code==503046 弹出网易盾 + if (res && res.code === '1') { + this.service.msgSrv.success('发送成功'); + this.codeCountDown(); + } else if (res.code === '503046') { + // this.dun.popUp(); + } else { + this.service.msgSrv.success(res.msg); + } + }); + } + + /* code倒计时 */ + codeCountDown() { + this.count = 59; + this.interval$ = setInterval(() => { + this.count -= 1; + if (this.count <= 0) { + clearInterval(this.interval$); + } + }, 1000); + } + /* 网易盾验证通过 */ + captchaDone(validate: any) { + this.codeCountDown(); + } + + getInfo() { + const params = { + // id: this.i.id, + }; + this.service.http.post(this.service.$api_get_current_user_detail, params).subscribe((res) => { + // if (res) { + // this.getCaptcha(res.data.phone); + // } + }); + } + /** + * 验证组件名称 + * 规则:以小写字母开头,长度1-20, 仅限小写字母、数字和横线 + */ + // validatecomponent(value: string): Observable { + // return new Observable((observer: Observer) => { + // if (!value || value.trim().length === 0) { + // observer.next([{ keyword: 'required', message: '用户名不能为空!' }]); + // return; + // } + + // let isCheck: any; + // this.service.request(this.service.$api_checkUserName, { userName: value }, 'POST', true, 'FORM').subscribe((res) => { + // // 检查用户名 + // isCheck = res; + // }); + + // setTimeout(() => { + // // 以小写字母开头,长度1-20, 仅限小写字母、数字和横线 + // // const partern = /^[a-z][a-zA-Z0-9-]{0,30}$/; + + // // 3-30个字符,支持中英文、数字、符号“_”和“-” + // const partern = /^[a-zA-Z0-9_\-\u4e00-\u9fa5]{3,30}$/; + // const reg = new RegExp(partern); + // const result = reg.test(value); + // const name = this.sf?.getValue('/oldName'); + // if (name === value) { + // observer.next([{ keyword: 'validateName', message: '新用户名不能与旧用户名一样' }]); + // return; + // } + // console.log(value, 'value', isCheck); + // if (!isCheck) { + // observer.next([{ keyword: 'validateName', message: '用户名已存在,请修改' }]); + // return; + // } + // if (!result) { + // observer.next([{ keyword: 'validateName', message: '请输入3-30个字符,且不能含有特殊符号!' }]); + // } else { + // observer.next([]); + // } + // observer.complete(); + // }, 500); + // }); + // } + // this.usernameValidator = (control: FormControl) => { + // if (control.value === this.i.name) { + // return of(null); + // } + // return control.valueChanges.pipe( + + // ); + // }; + close() { + this.modal.destroy(); + } + submitForm() { + console.log(this.sf.value, 'this.sf.value'); + const params = { + ...this.sf.value, + }; + this.service.http.post(this.service.$api_updateUserName, params).subscribe((res) => { + console.log(res, 'submitForm'); + if (res.success) { + this.service.msgSrv.success(res.msg); + this.modal.close(true); + } else { + this.service.msgSrv.warning(res.msg); + } + }); + } +} diff --git a/src/app/routes/account/components/edit-password/edit-password.component.html b/src/app/routes/account/components/edit-password/edit-password.component.html new file mode 100644 index 00000000..4c4681a4 --- /dev/null +++ b/src/app/routes/account/components/edit-password/edit-password.component.html @@ -0,0 +1,78 @@ + +
+ + 新密码 + + + + + + + + + + + 确认新密码 + + + + + + + + + + + 手机号 + 158****4444 + + + + Captcha + + +
+
+ +
+
+ + {{ count > 0 ? '请等待' + count + 's' : '获取验证码' }} +
+
+
+
+
+
+ + +
diff --git a/src/app/routes/account/components/edit-password/edit-password.component.ts b/src/app/routes/account/components/edit-password/edit-password.component.ts new file mode 100644 index 00000000..fb6ff72a --- /dev/null +++ b/src/app/routes/account/components/edit-password/edit-password.component.ts @@ -0,0 +1,97 @@ +/* + * @Author: your name + * @Date: 2021-11-29 13:50:46 + * @LastEditTime: 2021-11-29 14:58:33 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\account\components\edit\edit.component.ts + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { FormBuilder, FormGroup, Validators,ValidatorFn } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STChange, STColumn, STComponent, STData, STRequestOptions } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { NzDrawerRef, NzDrawerService } from 'ng-zorro-antd/drawer'; +import { NzFormTooltipIcon } from 'ng-zorro-antd/form'; +import { NzModalRef } from 'ng-zorro-antd/modal'; + +@Component({ + selector: 'app-account-components-edit', + templateUrl: './edit-password.component.html', +}) +export class AccountComponentsCenterEditComponent implements OnInit { + url = `/rule?_allow_anonymous=true`; + validateForm!: FormGroup; + record: any; + count = 0; + type = 'create'; + passwordVisible = false; + passwordVisible2 = false; + password?: string; + password2?: string; + interval$: any; + confirmPasswordValidator!: ValidatorFn; + captchaTooltipIcon: NzFormTooltipIcon = { + type: 'info-circle', + theme: 'twotone' + }; + constructor( + public router: Router, + public ar: ActivatedRoute, + private modalRef: NzModalRef, + private fb: FormBuilder, + ) { + } + + ngOnInit() { + this.validateForm = this.fb.group({ + passWord: [ + null, + [ + Validators.required, + Validators.maxLength(16), + Validators.minLength(8), + Validators.pattern('^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z-_]{8,16}$'), + ], + ], + passWordTo: [null, [this.confirmPasswordValidator, Validators.required, Validators.maxLength(16), Validators.minLength(8)]], + voucher: [null, [Validators.required]], + }); + } + + destroyModal(): void { + this.modalRef.destroy(); + } + getCaptcha(e: MouseEvent): void { + e.preventDefault(); + this.codeCountDown() + } + save() { + // const params = { id: this.record.id, name: this.validateForm.value.name }; + // this.service.request(this.service.$api_feedbackTypeupdate, params).subscribe((res) => { + // if (res) { + // this.modalRef.close(true); + // this.service.msgSrv.success('保存成功!'); + // } else { + // this.service.msgSrv.error(res.msg); + // } + // }); + } + /* code倒计时 */ + codeCountDown() { + this.count = 59; + this.interval$ = setInterval(() => { + this.count -= 1; + if (this.count <= 0) { + clearInterval(this.interval$); + } + }, 1000); + } + submitForm(): void { + // tslint:disable-next-line: forin + for (const i in this.validateForm.controls) { + this.validateForm.controls[i].markAsDirty(); + this.validateForm.controls[i].updateValueAndValidity(); + } + } +} diff --git a/src/app/routes/account/services/account.service.ts b/src/app/routes/account/services/account.service.ts new file mode 100644 index 00000000..7e25b5d7 --- /dev/null +++ b/src/app/routes/account/services/account.service.ts @@ -0,0 +1,61 @@ +/* + * @Author: your name + * @Date: 2021-11-02 11:12:21 + * @LastEditTime: 2021-11-05 10:04:26 + * @LastEditors: your name + * @Description: In User Settings Edit + * @FilePath: \scm-ows-ui\src\app\routes\account\services\account.service.ts + */ +import { Injectable, Injector } from '@angular/core'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { map } from 'rxjs/operators'; +import { BaseService } from 'src/app/shared/services/core/base.service'; +import { EAFileUtil } from 'src/app/shared/utils/file.util'; + +@Injectable({ + providedIn: 'root', +}) +export class AccountService extends BaseService { + public $api_add_one!: string; + public $api_add_many!: string; + public $api_edit_one!: string; + public $api_edit_many!: string; + public $api_del_one!: string; + public $api_del_many!: string; + public $api_get_many!: string; + public $api_get_one!: string; + public $api_get_page!: string; + public $api_export!: string; + public $api_import!: string; + public $api_import_download_tpl!: string; + // 获取当前登录用户详情 + $api_get_current_user_detail = `/cuc/user/getUserInfo`; + // 获取当前登录用户基本信息 + $api_getUserInfo = `/cuc/user/getUserInfo`; + // 修改用户信息 + $api_updateUserInfo = `/cuc/userBasicInfo/updateUserInfo`; + // 凭证修改手机号 + $api_voucherUpdatePhone = '/cuc/userBasicInfo/forgetPassword/voucherUpdatePhone'; + // 凭证修改密码 + $api_voucherUpdatePassword = '/cuc/userBasicInfo/forgetPassword/voucherUpdatePassword'; + // 根据当前登录用户绑定的手机号码获取短信验证码 + public $api_get_msg_code = `/cuc/userBasicInfo/getLoginUserSMVerificationCode`; + // 验证手机号 + $api_verifyPhone = '/cuc/userBasicInfo/forgetPassword/verifyPhone'; + + // 获取当前登录用户详情 + $api_get_current_user_info = `/cuc/user/getUserInfo`; + + // 修改用户名 + $api_updateUserName = `/cuc/userBasicInfo/updateUserName`; + // 验证用户名是否已被使用 + $api_checkUserName = `/cuc/userBasicInfo/checkUserName`; + + // constructor(http: _HttpClient, msgSrv: NzMessageService, fileExt: EAFileUtil) { + // super(http, msgSrv, fileExt); + // } + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/routes-routing.module.ts b/src/app/routes/routes-routing.module.ts index b1e59f60..7726d684 100644 --- a/src/app/routes/routes-routing.module.ts +++ b/src/app/routes/routes-routing.module.ts @@ -1,3 +1,11 @@ +/* + * @Author: your name + * @Date: 2021-11-29 10:20:33 + * @LastEditTime: 2021-11-29 11:05:20 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\routes-routing.module.ts + */ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; // layout @@ -14,7 +22,11 @@ const routes: Routes = [ children: [ { path: '', redirectTo: 'dashboard', pathMatch: 'full' }, { path: 'dashboard', component: DashboardComponent }, - { path: 'demo', loadChildren: () => import('./demo/demo.module').then(m => m.DemoModule) } + { path: 'demo', loadChildren: () => import('./demo/demo.module').then(m => m.DemoModule) }, + { + path: 'account', + loadChildren: () => import('./account/account.module').then((m) => m.AccountModule), + }, ] }, // passport diff --git a/src/app/shared/index.ts b/src/app/shared/index.ts index 86cfaf5c..7b37910b 100644 --- a/src/app/shared/index.ts +++ b/src/app/shared/index.ts @@ -1,3 +1,11 @@ +/* + * @Author: your name + * @Date: 2021-11-29 10:04:12 + * @LastEditTime: 2021-11-29 11:19:24 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\shared\index.ts + */ // Modules export * from './components/delay/index'; export * from './components/editor/index'; @@ -7,6 +15,7 @@ export * from './components/mouse-focus/index'; export * from './components/status-label/index'; export * from './components/scrollbar/index'; export * from './components/address/index'; +export * from './components/captcha/index'; // Utils export * from './utils/yuan'; diff --git a/src/app/shared/shared-delon.module.ts b/src/app/shared/shared-delon.module.ts index 6b3c0e99..097d78f6 100644 --- a/src/app/shared/shared-delon.module.ts +++ b/src/app/shared/shared-delon.module.ts @@ -2,5 +2,6 @@ import { PageHeaderModule } from '@delon/abc/page-header'; import { SEModule } from '@delon/abc/se'; import { STModule } from '@delon/abc/st'; import { SVModule } from '@delon/abc/sv'; +import { DelonFormModule } from '@delon/form'; -export const SHARED_DELON_MODULES = [PageHeaderModule, STModule, SVModule, SEModule]; +export const SHARED_DELON_MODULES = [PageHeaderModule, STModule, SVModule, SEModule,DelonFormModule ]; diff --git a/src/app/shared/shared-zorro.module.ts b/src/app/shared/shared-zorro.module.ts index 794dc59c..8bbf3e97 100644 --- a/src/app/shared/shared-zorro.module.ts +++ b/src/app/shared/shared-zorro.module.ts @@ -1,3 +1,12 @@ +/* + * @Author: your name + * @Date: 2021-11-29 10:20:33 + * @LastEditTime: 2021-11-29 14:59:56 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\shared\shared-zorro.module.ts + */ +import { NzStepsModule } from 'ng-zorro-antd/steps'; import { NzAlertModule } from 'ng-zorro-antd/alert'; import { NzBadgeModule } from 'ng-zorro-antd/badge'; import { NzButtonModule } from 'ng-zorro-antd/button'; @@ -12,6 +21,7 @@ import { NzInputModule } from 'ng-zorro-antd/input'; import { NzSelectModule } from 'ng-zorro-antd/select'; import { NzSpinModule } from 'ng-zorro-antd/spin'; import { NzTableModule } from 'ng-zorro-antd/table'; +import { NzListModule } from 'ng-zorro-antd/list'; export const SHARED_ZORRO_MODULES = [ NzButtonModule, @@ -28,4 +38,6 @@ export const SHARED_ZORRO_MODULES = [ NzIconModule, NzSpinModule, NzDividerModule, + NzStepsModule, + NzListModule, ]; From 2450c201516bedbb7aead666582697363e0e8cc2 Mon Sep 17 00:00:00 2001 From: Taric Xin Date: Mon, 29 Nov 2021 19:37:46 +0800 Subject: [PATCH 0002/1600] =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 +- src/app/layout/layout.module.ts | 3 +- .../layout/passport/passport.component.html | 26 +- .../layout/passport/passport.component.less | 79 +----- src/app/layout/passport/passport.component.ts | 15 -- src/app/routes/passport/callback.component.ts | 35 --- .../components/login/login.component.html | 56 +++++ .../components/login/login.component.less | 103 ++++++++ .../components/login/login.component.ts | 224 ++++++++++++++++++ .../order-agreement.component.html | 9 + .../order-agreement.component.less | 12 + .../order-agreement.component.spec.ts | 23 ++ .../order-agreement.component.ts | 26 ++ .../retrieve-password.component.html | 144 +++++++++++ .../retrieve-password.component.less | 86 +++++++ .../retrieve-password.component.ts | 196 +++++++++++++++ .../routes/passport/lock/lock.component.html | 21 -- .../routes/passport/lock/lock.component.less | 12 - .../routes/passport/lock/lock.component.ts | 44 ---- .../passport/login/login.component.html | 77 ------ .../passport/login/login.component.less | 53 ----- .../routes/passport/login/login.component.ts | 213 ----------------- .../passport/login2/login2.component.html | 56 ----- .../passport/login2/login2.component.less | 28 --- .../passport/login2/login2.component.ts | 78 ------ .../passport/login3/login3.component.html | 51 ---- .../passport/login3/login3.component.less | 13 - .../passport/login3/login3.component.ts | 78 ------ .../passport/passport-routing.module.ts | 41 ++-- src/app/routes/passport/passport.module.ts | 29 ++- .../register-result.component.html | 13 - .../register-result.component.ts | 15 -- .../passport/register/register.component.html | 89 ------- .../passport/register/register.component.less | 42 ---- .../passport/register/register.component.ts | 139 ----------- .../passport/services/passport.service.ts | 17 ++ src/assets/images/user/login-image.png | Bin 0 -> 232500 bytes src/assets/images/user/logo.png | Bin 0 -> 2504 bytes src/style-icons-auto.ts | 6 +- src/style-icons.ts | 14 +- 40 files changed, 972 insertions(+), 1198 deletions(-) delete mode 100644 src/app/routes/passport/callback.component.ts create mode 100644 src/app/routes/passport/components/login/login.component.html create mode 100644 src/app/routes/passport/components/login/login.component.less create mode 100644 src/app/routes/passport/components/login/login.component.ts create mode 100644 src/app/routes/passport/components/order-agreement/order-agreement.component.html create mode 100644 src/app/routes/passport/components/order-agreement/order-agreement.component.less create mode 100644 src/app/routes/passport/components/order-agreement/order-agreement.component.spec.ts create mode 100644 src/app/routes/passport/components/order-agreement/order-agreement.component.ts create mode 100644 src/app/routes/passport/components/retrieve-password/retrieve-password.component.html create mode 100644 src/app/routes/passport/components/retrieve-password/retrieve-password.component.less create mode 100644 src/app/routes/passport/components/retrieve-password/retrieve-password.component.ts delete mode 100644 src/app/routes/passport/lock/lock.component.html delete mode 100644 src/app/routes/passport/lock/lock.component.less delete mode 100644 src/app/routes/passport/lock/lock.component.ts delete mode 100644 src/app/routes/passport/login/login.component.html delete mode 100644 src/app/routes/passport/login/login.component.less delete mode 100644 src/app/routes/passport/login/login.component.ts delete mode 100644 src/app/routes/passport/login2/login2.component.html delete mode 100644 src/app/routes/passport/login2/login2.component.less delete mode 100644 src/app/routes/passport/login2/login2.component.ts delete mode 100644 src/app/routes/passport/login3/login3.component.html delete mode 100644 src/app/routes/passport/login3/login3.component.less delete mode 100644 src/app/routes/passport/login3/login3.component.ts delete mode 100644 src/app/routes/passport/register-result/register-result.component.html delete mode 100644 src/app/routes/passport/register-result/register-result.component.ts delete mode 100644 src/app/routes/passport/register/register.component.html delete mode 100644 src/app/routes/passport/register/register.component.less delete mode 100644 src/app/routes/passport/register/register.component.ts create mode 100644 src/app/routes/passport/services/passport.service.ts create mode 100644 src/assets/images/user/login-image.png create mode 100644 src/assets/images/user/logo.png diff --git a/package.json b/package.json index 7084f7c1..fcc9159c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "ng-alain-pro", + "name": "tms-obc-web", "version": "0.0.0", - "description": "Ng-alain business theme, ng-zorro-antd admin panel front-end framework", + "description": "运营后台-WEB", "author": "cipchk ", "repository": { "type": "git", diff --git a/src/app/layout/layout.module.ts b/src/app/layout/layout.module.ts index 5c0eac3c..3afd4206 100644 --- a/src/app/layout/layout.module.ts +++ b/src/app/layout/layout.module.ts @@ -24,7 +24,7 @@ import { NzSpinModule } from 'ng-zorro-antd/spin'; import { NzSwitchModule } from 'ng-zorro-antd/switch'; import { NzTimelineModule } from 'ng-zorro-antd/timeline'; import { NzToolTipModule } from 'ng-zorro-antd/tooltip'; - +import { NzGridModule } from 'ng-zorro-antd/grid'; import { LayoutPassportComponent } from './passport/passport.component'; import { PRO_COMPONENTS } from './pro/index'; @@ -56,6 +56,7 @@ const COMPONENTS: Array> = [...PRO_COMPONENTS, LayoutPassportComponent NoticeIconModule, ThemeBtnModule, ScrollbarModule, + NzGridModule, NzMessageModule ], declarations: COMPONENTS, diff --git a/src/app/layout/passport/passport.component.html b/src/app/layout/passport/passport.component.html index e9beaece..cc5e24e2 100644 --- a/src/app/layout/passport/passport.component.html +++ b/src/app/layout/passport/passport.component.html @@ -1,13 +1,17 @@ -
- -
-
-
- - ng-alain pro + + +
+
+ +
+
+
-
武林中最有影响力的《葵花宝典》;欲练神功,挥刀自宫
- -
-
\ No newline at end of file + + +
+ +
+
+ \ No newline at end of file diff --git a/src/app/layout/passport/passport.component.less b/src/app/layout/passport/passport.component.less index a17b975f..a2cc9559 100644 --- a/src/app/layout/passport/passport.component.less +++ b/src/app/layout/passport/passport.component.less @@ -1,74 +1,21 @@ @import '~@delon/theme/index'; + :host { ::ng-deep { - .container { - display: flex; - flex-direction: column; - min-height: 100%; - background: #f0f2f5; - } - .langs { - width: 100%; - height: 40px; - line-height: 44px; - text-align: right; - .ant-dropdown-trigger { - display: inline-block; - } - .anticon { - margin-top: 24px; - margin-right: 24px; - font-size: 14px; - vertical-align: top; - cursor: pointer; - } - } - .wrap { - flex: 1; - padding: 32px 0; - } - .ant-form-item { - margin-bottom: 24px; + .layout { + height: 100%; } - @media (min-width: @screen-md-min) { - .container { - background-image: url('https://gw.alipayobjects.com/zos/rmsportal/TVYTbAXWheQpRcWDaDMu.svg'); - background-repeat: no-repeat; - background-position: center 110px; - background-size: 100%; - } - .wrap { - padding: 32px 0 24px; - } - } - .top { - text-align: center; - } - .header { - height: 44px; - line-height: 44px; - a { - text-decoration: none; - } - } - .logo { - height: 44px; - margin-right: 16px; - } - .title { - position: relative; - color: @heading-color; - font-weight: 600; - font-size: 33px; - font-family: 'Myriad Pro', 'Helvetica Neue', Arial, Helvetica, sans-serif; - vertical-align: middle; - } - .desc { - margin-top: 12px; - margin-bottom: 40px; - color: @text-color-secondary; - font-size: @font-size-base; + .ant-layout-header { + background: #ffffff; + box-shadow: 0px 5px 5px #d1d1d1; } } } + +.title { + color : #1890ff; + font-weight: 800; + font-size : 28px; + text-align : center; +} \ No newline at end of file diff --git a/src/app/layout/passport/passport.component.ts b/src/app/layout/passport/passport.component.ts index c48bb161..5c6e216c 100644 --- a/src/app/layout/passport/passport.component.ts +++ b/src/app/layout/passport/passport.component.ts @@ -7,21 +7,6 @@ import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth'; styleUrls: ['./passport.component.less'] }) export class LayoutPassportComponent implements OnInit { - links = [ - { - title: '帮助', - href: '' - }, - { - title: '隐私', - href: '' - }, - { - title: '条款', - href: '' - } - ]; - constructor(@Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService) {} ngOnInit(): void { diff --git a/src/app/routes/passport/callback.component.ts b/src/app/routes/passport/callback.component.ts deleted file mode 100644 index 8e205c62..00000000 --- a/src/app/routes/passport/callback.component.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { SocialService } from '@delon/auth'; -import { SettingsService } from '@delon/theme'; - -@Component({ - selector: 'app-callback', - template: ``, - providers: [SocialService] -}) -export class CallbackComponent implements OnInit { - type = ''; - - constructor(private socialService: SocialService, private settingsSrv: SettingsService, private route: ActivatedRoute) {} - - ngOnInit(): void { - this.type = this.route.snapshot.params.type; - this.mockModel(); - } - - private mockModel(): void { - const info = { - token: '123456789', - name: 'cipchk', - email: `${this.type}@${this.type}.com`, - id: 10000, - time: +new Date() - }; - this.settingsSrv.setUser({ - ...this.settingsSrv.user, - ...info - }); - this.socialService.callback(info); - } -} diff --git a/src/app/routes/passport/components/login/login.component.html b/src/app/routes/passport/components/login/login.component.html new file mode 100644 index 00000000..a898e534 --- /dev/null +++ b/src/app/routes/passport/components/login/login.component.html @@ -0,0 +1,56 @@ +
+
+
+ +
+
+
+

运营管理后台

+ + + + + + + + + + + + + + + + + + +
+

+ 登录即代表您同意 《平台服务协议》 + 《隐私政策》 +

+ +
+
+
+
+ +
+ + + + 获取验证码 + + 请等待{{ count }}s + \ No newline at end of file diff --git a/src/app/routes/passport/components/login/login.component.less b/src/app/routes/passport/components/login/login.component.less new file mode 100644 index 00000000..67a83203 --- /dev/null +++ b/src/app/routes/passport/components/login/login.component.less @@ -0,0 +1,103 @@ +.body-box { + display : flex; + -webkit-flex-direction: column; + -ms-flex-direction : column; + flex-direction : column; + justify-content : space-between; + width : 100%; + max-width : 1080px; + height : 100%; + margin : auto; + padding : 50px 0 80px; + -webkit-box-orient : vertical; + + .box-header { + max-width : 240px; + max-height : 48px; + margin-bottom: 36px; + } + + .box-content { + width : 100%; + height: 560px; + + .form-box { + margin : 0 auto; + padding : 40px 88px 40px; + background-color: #fff; + + .title { + margin-bottom: 30px; + color : #1890ff; + font-weight : 800; + font-size : 32px; + text-align : center; + } + + .other { + margin-top : 24px; + line-height: 22px; + text-align : left; + } + } + } + + .box-footer { + padding-top: 70px; + color : #626262; + font-weight: 400; + font-size : 14px; + text-align : center; + } +} + +::ng-deep { + passport-login { + background-color: #f0f4f7; + } +} + +:host ::ng-deep { + + input::-webkit-outer-spin-button, + input::-webkit-inner-spin-button { + -webkit-appearance: none; + } + + /* 火狐 */ + input[type='number'] { + -moz-appearance: textfield; + } + + // tabs样式调整 + .ant-tabs-nav-list { + justify-content: space-between; + width : 281px; + margin : auto; + + .ant-tabs-tab-btn { + font-size: 18px; + } + + .ant-tabs-tab { + margin: 0; + } + } + + .ant-tabs-top>.ant-tabs-nav { + margin: 0 0 30px 0; + + .ant-tabs-ink-bar { + height: 4px; + } + } + + .ant-tabs-top>.ant-tabs-nav::before { + border-bottom: 0; + } + + nz-input-group { + height : 50px; + font-size: 16px; + } +} \ No newline at end of file diff --git a/src/app/routes/passport/components/login/login.component.ts b/src/app/routes/passport/components/login/login.component.ts new file mode 100644 index 00000000..f83637d4 --- /dev/null +++ b/src/app/routes/passport/components/login/login.component.ts @@ -0,0 +1,224 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, OnDestroy, OnInit, Optional, ViewChild } from '@angular/core'; +import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { Router } from '@angular/router'; +import { StartupService } from '@core'; +import { ReuseTabService } from '@delon/abc/reuse-tab'; +import { DA_SERVICE_TOKEN, ITokenService, SocialOpenType, SocialService } from '@delon/auth'; +import { SFComponent, SFSchema, SFUISchema, SFStringWidgetSchema } from '@delon/form'; +import { SettingsService, _HttpClient } from '@delon/theme'; +import { environment } from '@env/environment'; +import { NzTabChangeEvent } from 'ng-zorro-antd/tabs'; +import { interval } from 'rxjs'; +import { finalize, take } from 'rxjs/operators'; +import { DunHelper } from 'src/app/shared/components/captcha'; +import { EAUserService, EACaptchaService, EAValidateService, EAPlatformService } from 'src/app/shared/services'; + +@Component({ + selector: 'passport-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.less'], + host: { + '[class.ant-row]': 'true', + '[class.pro-passport]': 'true' + } +}) +export class UserLoginComponent implements OnInit, OnDestroy { + @ViewChild('accountSF', { static: false }) + accountSF!: SFComponent; + @ViewChild('captchaSF', { static: false }) + captchaSF!: SFComponent; + accountSchema!: SFSchema; + accountUI!: SFUISchema; + captchaSchema!: SFSchema; + captchaUI!: SFUISchema; + count = 0; + type = 0; + // vcode = null; + + imageUrl = './assets/images/user/logo.png'; + copyright = ''; + constructor( + public userSrv: EAUserService, + private captchaSrv: EACaptchaService, + private validateSrv: EAValidateService, + private dunHelper: DunHelper, + private cdr: ChangeDetectorRef, + private router: Router + ) { + // this.vcode = this.platformSrv.getOperatorCode(); + // 加载copyright信息 + // this.userSrv + // .request(this.platformSrv.$api_get_config, { + // pageIndex: 1, + // pageSize: 999, + // }) + // .subscribe((res: any) => { + // this.copyright = res?.records?.find((f: any) => f.configKey === 'website.copyright')?.configValue; + // this.imageUrl = res?.records?.find((f: any) => f.configKey === 'platform.saas.logo')?.configValue; + // }); + } + + ngOnInit(): void { + this.initAccountSF(); + this.initCaptchaSF(); + } + + initAccountSF(): void { + this.accountSchema = { + properties: { + username: { + title: '', + type: 'string', + maxLength: 30, + ui: { + placeholder: '请输入您的账号', + prefixIcon: 'user', + size: 'large' + } as SFStringWidgetSchema + }, + password: { + title: '', + type: 'string', + ui: { + placeholder: '请输入您的密码', + prefixIcon: 'lock', + type: 'password', + size: 'large' + } as SFStringWidgetSchema + } + // sc: { + // title: '', + // type: 'string', + // ui: { + // hidden: !!this.vcode, + // placeholder: '请输入安全码', + // prefixIcon: 'safety', + // size: 'large', + // errors: { + // required: '请输入安全码' + // } + // } as SFStringWidgetSchema, + // default: this.vcode + // } + }, + required: ['username', 'password'] + }; + this.accountUI = { + '*': { spanLabelFixed: 110, grid: { span: 24 } } + }; + } + + initCaptchaSF(): void { + this.captchaSchema = { + properties: { + phone: { + title: '', + type: 'string', + format: 'mobile', + maxLength: 11, + ui: { + placeholder: '请输入您的手机号', + prefixIcon: 'mobile', + size: 'large', + errors: { required: '请输入手机号!', format: '手机号格式错误' } + } as SFStringWidgetSchema + }, + smsCode: { + title: '', + type: 'string', + maxLength: 6, + ui: { + widget: 'custom', + size: 'large', + errors: { required: '请输入验证码!', maxLength: '验证码错误' } + } + } + // sc: { + // title: '', + // type: 'string', + // ui: { + // hidden: !!this.vcode, + // placeholder: '请输入安全码', + // prefixIcon: 'safety', + // size: 'large', + // errors: { + // required: '请输入安全码' + // } + // } as SFStringWidgetSchema, + // default: this.vcode + // } + }, + required: ['phone', 'smsCode'] + }; + this.captchaUI = { + '*': { spanLabelFixed: 110, grid: { span: 24 } } + }; + } + + /** + * 获取验证码 + */ + getCaptcha(): void { + this.captchaSF.getProperty('/phone')?.updateValueAndValidity(); + const result = this.validateSrv.validateMobile(this.captchaSF.value.phone); + // this.captchaSrv.sendSMSCaptchaByMobile(); + if (result) { + this.captchaSrv.sendSMSCaptchaByMobile(this.captchaSF.value.phone).subscribe(res => { + if (res.success && res.data.code === '1') { + this.captchaSrv.msgSrv.success('发送验证码成功'); + this.createInterval(); + } else if (res.data.code === '503046') { + this.dunHelper.popUp(this.captchaSF.value.phone).subscribe(_ => { + this.createInterval(); + this.dunHelper.destory(); + }); + } else { + this.captchaSrv.msgSrv.warning(res.msg); + } + }); + } + } + + /** + * 登录 + */ + submit(): void { + if (this.type === 0) { + this.captchaSF.validator({ emitError: true }); + if (!this.captchaSF.valid) { + return; + } + // this.userSrv.loginByCaptcha(this.captchaSF.value.phone, this.captchaSF.value.smsCode, this.captchaSF.value.sc); + } else { + this.accountSF.validator({ emitError: true }); + if (!this.accountSF.valid) { + return; + // this.userSrv.loginByAccount(this.accountSF.value.username, this.accountSF.value.password, this.accountSF.value.sc); + } + } + this.router.navigateByUrl('/'); + /* if (!this.accountSF.valid && !this.captchaSF.valid) { + return; + } + + Object.prototype.hasOwnProperty.call(value, 'username') + ? this.userSrv.loginByAccount(value.username, value.password) + : this.userSrv.loginByCaptcha(value.phone, value.smsCode); */ + } + + switch(ret: any) { + this.type = ret.index; + } + + ngOnDestroy(): void {} + + private createInterval() { + this.count = 59; + interval(1000) + .pipe(take(60)) + .subscribe(x => { + this.count = 59 - (x + 1); + this.cdr.detectChanges(); + }); + } +} diff --git a/src/app/routes/passport/components/order-agreement/order-agreement.component.html b/src/app/routes/passport/components/order-agreement/order-agreement.component.html new file mode 100644 index 00000000..6aefe172 --- /dev/null +++ b/src/app/routes/passport/components/order-agreement/order-agreement.component.html @@ -0,0 +1,9 @@ +
+
+

+ {{ agreementContent?.typeName }} +

+

最新版本生效日期:{{ agreementContent?.modifyTime }}

+
+
+
diff --git a/src/app/routes/passport/components/order-agreement/order-agreement.component.less b/src/app/routes/passport/components/order-agreement/order-agreement.component.less new file mode 100644 index 00000000..867915ea --- /dev/null +++ b/src/app/routes/passport/components/order-agreement/order-agreement.component.less @@ -0,0 +1,12 @@ +@import '~@delon/theme/index'; + +:host { + .page-box { + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 50px; + background-color: #fff; + } +} diff --git a/src/app/routes/passport/components/order-agreement/order-agreement.component.spec.ts b/src/app/routes/passport/components/order-agreement/order-agreement.component.spec.ts new file mode 100644 index 00000000..9ad146da --- /dev/null +++ b/src/app/routes/passport/components/order-agreement/order-agreement.component.spec.ts @@ -0,0 +1,23 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { OrderAgreementComponent } from './order-agreement.component'; + +describe('OrderAgreementComponent', () => { + let component: OrderAgreementComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [OrderAgreementComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderAgreementComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/passport/components/order-agreement/order-agreement.component.ts b/src/app/routes/passport/components/order-agreement/order-agreement.component.ts new file mode 100644 index 00000000..f4fd249e --- /dev/null +++ b/src/app/routes/passport/components/order-agreement/order-agreement.component.ts @@ -0,0 +1,26 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Params } from '@angular/router'; +import { PassportService } from '../../services/passport.service'; + +@Component({ + selector: 'app-buyer-components-serve-order-agreement', + templateUrl: './order-agreement.component.html', + styleUrls: ['./order-agreement.component.less'] +}) +export class OrderAgreementComponent implements OnInit { + agreementContent: any; + type = 2; + constructor(private ar: ActivatedRoute, private service: PassportService) { + ar.queryParams.subscribe((params: Params) => { + this.type = params.type || 2; + }); + } + ngOnInit() { + this.service.request(this.service.$api_get_agreement, { type: this.type }).subscribe(res => { + if (res) { + console.log(res); + this.agreementContent = res; + } + }); + } +} diff --git a/src/app/routes/passport/components/retrieve-password/retrieve-password.component.html b/src/app/routes/passport/components/retrieve-password/retrieve-password.component.html new file mode 100644 index 00000000..9a572741 --- /dev/null +++ b/src/app/routes/passport/components/retrieve-password/retrieve-password.component.html @@ -0,0 +1,144 @@ +
+ + + + + + + +
+ +
+
+
+ + 手机号 + + + + + + 验证码 + + + + + + + + + + + +
+
+
+
+ + + +
+
+
+ + 设置新密码 + + + + + + + + + +
+
+ + +
+ +
+
+ + 重复新密码 + + + + + + + + + +
+
+ + +
+ +
+
+ + + + + +
+
+
+
+ + + + +
+ + 密码设置成功! + 密码设置失败! +
+
+ +
请牢记您的新密码,3秒后自动跳转至登录页...
+
+ + + +
+
+
+
+
+ + + + 获取验证码 + + 请等待{{ count }}s + + + \ No newline at end of file diff --git a/src/app/routes/passport/components/retrieve-password/retrieve-password.component.less b/src/app/routes/passport/components/retrieve-password/retrieve-password.component.less new file mode 100644 index 00000000..31408925 --- /dev/null +++ b/src/app/routes/passport/components/retrieve-password/retrieve-password.component.less @@ -0,0 +1,86 @@ +:host { + ::ng-deep { + .ant-steps { + margin: 0 auto; + width : 500px; + } + + .ant-steps-item-process>.ant-steps-item-container>.ant-steps-item-tail::after { + background-color: #999494; + } + + .ant-steps-item-wait>.ant-steps-item-container>.ant-steps-item-tail::after { + background-color: #999494; + } + + .ant-spin-container { + background-color: #f8f8f8; + } + + .ant-form-item-label>label { + height: 40px; + } + + } + + .main { + max-width: 1200px; + margin : 0 auto; + overflow : hidden; + } + + page-grid { + width : 100%; + height : 100%; + background-color: #fff; + margin : 100px auto; + + .myForm { + margin-top : 3rem; + margin-bottom: 5rem; + } + + .steps-content { + margin-top : 16px; + border : 1px dashed #e9e9e9; + border-radius : 6px; + background-color: #ffffff; + min-height : 250px; + // text-align: center; + } + + .steps-action { + margin-top: 24px; + } + + button { + margin-right: 8px; + } + } +} + +.input-tootip { + width : 250px; + padding-left: 20px; + display : flex; + display : flex; + align-items : center; + + .dot { + font-size: 21px; + color : #bdb8b8; + } + + .valid-icon { + color: rgb(217 0 27); + } + + .invalid-icon { + color: rgb(82 196 26); + } + + .tootip-label { + margin-left: 8px; + font-size : 12px; + } +} \ No newline at end of file diff --git a/src/app/routes/passport/components/retrieve-password/retrieve-password.component.ts b/src/app/routes/passport/components/retrieve-password/retrieve-password.component.ts new file mode 100644 index 00000000..a5c9814f --- /dev/null +++ b/src/app/routes/passport/components/retrieve-password/retrieve-password.component.ts @@ -0,0 +1,196 @@ +import { AfterViewInit, ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core'; +import { FormBuilder, FormGroup, ValidatorFn, Validators } from '@angular/forms'; +import { Router } from '@angular/router'; +import { interval } from 'rxjs'; +import { take } from 'rxjs/operators'; +import { EAUserService } from 'src/app/shared/services/business/user.service'; + +@Component({ + selector: 'app-routes-password-retrieve-password', + templateUrl: './retrieve-password.component.html', + styleUrls: ['./retrieve-password.component.less'] +}) +export class UserRetrievePasswordComponent implements OnInit, AfterViewInit { + step = 0; + count = 0; + interval$: any; + formGroup1!: FormGroup; + formGroup2!: FormGroup; + confirmPasswordValidator!: ValidatorFn; + result = true; + + isPassWordHide = true; + isConfirmPassWordHide = true; + + constructor(private fb: FormBuilder, public service: EAUserService, private router: Router, private cdr: ChangeDetectorRef) {} + + ngAfterViewInit(): void {} + + ngOnInit() { + this.initForm(); + } + + initForm() { + this.confirmPasswordValidator = control => { + if (!control.value) { + return { error: true, required: true }; + } else if (control.value !== this.formGroup2.controls.passWord.value) { + return { passWordTo: true, error: true }; + } + return {}; + }; + + this.formGroup1 = this.fb.group({ + phone: [null, [Validators.required]], + smsVerifyCode: [null, [Validators.required]], + voucher: [null, [Validators.required]] + }); + + this.formGroup2 = this.fb.group({ + passWord: [ + null, + [ + Validators.required, + Validators.maxLength(16), + Validators.minLength(8), + Validators.pattern('^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z-_]{8,16}$') + ] + ], + passWordTo: [null, [this.confirmPasswordValidator, Validators.maxLength(16), Validators.minLength(8)]], + voucher: [null, [Validators.required]], + phone: [null, [Validators.required]] + }); + } + + formSubmit() { + switch (this.step) { + case 0: + this.submitForm1(); + break; + case 1: + this.submitForm2(); + break; + } + } + + submitForm1() { + for (const i in this.formGroup1.controls) { + if (this.formGroup1.controls[i]) { + this.formGroup1.controls[i].markAsDirty(); + this.formGroup1.controls[i].updateValueAndValidity(); + } + } + if (this.formGroup1.value.smsVerifyCode.length !== 6) { + this.service.msgSrv.error('请输入6位验证码'); + return; + } + if (this.formGroup1.valid) { + const param = Object.assign({}, this.formGroup1.value); + this.service.http.post(this.service.$forgetPasswordVerifyIdentity, param).subscribe((res: any) => { + // console.log(res, 'submitForm1'); + if (res.success === true) { + this.formGroup2.patchValue( + { + voucher: res.data.voucher, + phone: this.formGroup1.value.phone + }, + { onlySelf: true } + ); + this.step = 1; + // clearInterval(this.interval$); + } else { + this.service.msgSrv.warning(res?.msg || '操作超时,请重新开始找回密码的流程!'); + // this.refreshPage(); + } + }); + } + } + + submitForm2() { + for (const i in this.formGroup2.controls) { + if ( this.formGroup2.controls[i]) { + this.formGroup2.controls[i].markAsDirty(); + this.formGroup2.controls[i].updateValueAndValidity(); + } + } + + if (this.formGroup2.valid) { + this.service.http + .post(this.service.$voucherUpdatePassword, this.formGroup2.value) + .subscribe((res: { success: any; data: boolean; msg: any }) => { + if (res.success && res.data === true) { + this.result = true; + this.step = 2; + setTimeout(() => { + //this.service.logout(); + this.router.navigateByUrl('/passport/login'); + }, 3000); + } else { + this.result = false; + this.service.msgSrv.warning(res.msg || '密码修改失败!'); + } + }); + } + } + + getCaptcha() { + for (const i in this.formGroup1.controls) { + if (true) { + this.formGroup1.controls[i].markAsDirty(); + this.formGroup1.controls[i].updateValueAndValidity(); + } + } + if (this.formGroup1.value.phone.length !== 11) { + this.service.msgSrv.error('请输入11位手机号'); + return; + } + if (this.formGroup1.value.phone) { + this.service.http + .post(`${this.service.$getAccountSMVerificationCode}`, null, { phoneNumber: this.formGroup1.value.phone }) + .subscribe((res: any) => { + // console.log(res, 'res'); + if (res.success) { + this.formGroup1.patchValue( + { + voucher: res?.data?.voucher + }, + { onlySelf: true } + ); + if (res?.data?.code === '1') { + this.codeCountDown(); + this.service.msgSrv.success('验证码已发送到该账号绑定的手机号!'); + } else if (res?.data?.code === '503046') { + // this.dun.popUp(); + } else { + this.service.msgSrv.error('获取验证码失败!'); + } + } else { + this.service.msgSrv.error(res.msg); + } + }); + } + } + + /* code倒计时 */ + codeCountDown() { + this.count = 59; + interval(1000) + .pipe(take(60)) + .subscribe(x => { + this.count = 59 - (x + 1); + this.cdr.detectChanges(); + }); + } + /* 网易盾验证通过 */ + captchaDone(validate: any) { + this.codeCountDown(); + } + + refreshPage() { + window.location.reload(); + } + + validateConfirmPassword(): void { + setTimeout(() => this.formGroup2.controls.passWordTo.updateValueAndValidity()); + } +} diff --git a/src/app/routes/passport/lock/lock.component.html b/src/app/routes/passport/lock/lock.component.html deleted file mode 100644 index 7f56ecdd..00000000 --- a/src/app/routes/passport/lock/lock.component.html +++ /dev/null @@ -1,21 +0,0 @@ -
-
-
- -
-
- - - - - - - - - - - - -
-
-
\ No newline at end of file diff --git a/src/app/routes/passport/lock/lock.component.less b/src/app/routes/passport/lock/lock.component.less deleted file mode 100644 index 80251d7a..00000000 --- a/src/app/routes/passport/lock/lock.component.less +++ /dev/null @@ -1,12 +0,0 @@ -:host ::ng-deep { - .ant-card-body { - position: relative; - margin-top: 80px; - } - .avatar { - position: absolute; - top: -20px; - left: 50%; - margin-left: -20px; - } -} diff --git a/src/app/routes/passport/lock/lock.component.ts b/src/app/routes/passport/lock/lock.component.ts deleted file mode 100644 index aac5496b..00000000 --- a/src/app/routes/passport/lock/lock.component.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Component, Inject } from '@angular/core'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { Router } from '@angular/router'; -import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth'; -import { SettingsService, User } from '@delon/theme'; - -@Component({ - selector: 'passport-lock', - templateUrl: './lock.component.html', - styleUrls: ['./lock.component.less'] -}) -export class UserLockComponent { - f: FormGroup; - - get user(): User { - return this.settings.user; - } - - constructor( - fb: FormBuilder, - @Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService, - private settings: SettingsService, - private router: Router - ) { - this.f = fb.group({ - password: [null, Validators.required] - }); - } - - submit(): void { - for (const i in this.f.controls) { - this.f.controls[i].markAsDirty(); - this.f.controls[i].updateValueAndValidity(); - } - if (this.f.valid) { - console.log('Valid!'); - console.log(this.f.value); - this.tokenService.set({ - token: '123' - }); - this.router.navigate(['dashboard']); - } - } -} diff --git a/src/app/routes/passport/login/login.component.html b/src/app/routes/passport/login/login.component.html deleted file mode 100644 index 924ddc48..00000000 --- a/src/app/routes/passport/login/login.component.html +++ /dev/null @@ -1,77 +0,0 @@ -
- - - - - - - - - - - - - - - - - - - - - - - - - - - 请输入手机号! - - - 手机号格式错误! - - - - - - - - - - - - - - - - - - - - - - - - - - 忘记密码 - - - - - -
-
- 其他登录方式 - - - - 注册账户 -
\ No newline at end of file diff --git a/src/app/routes/passport/login/login.component.less b/src/app/routes/passport/login/login.component.less deleted file mode 100644 index eb8287b9..00000000 --- a/src/app/routes/passport/login/login.component.less +++ /dev/null @@ -1,53 +0,0 @@ -@import '~@delon/theme/index'; -:host { - display: block; - width: 368px; - margin: 0 auto; - ::ng-deep { - .ant-tabs .ant-tabs-bar { - margin-bottom: 24px; - text-align: center; - border-bottom: 0; - } - .ant-tabs-tab { - font-size: 16px; - line-height: 24px; - } - .ant-input-affix-wrapper .ant-input:not(:first-child) { - padding-left: 4px; - } - .icon { - margin-left: 16px; - color: rgba(0, 0, 0, 0.2); - font-size: 24px; - vertical-align: middle; - cursor: pointer; - transition: color 0.3s; - &:hover { - color: @primary-color; - } - } - .other { - margin-top: 24px; - line-height: 22px; - text-align: left; - nz-tooltip { - vertical-align: middle; - } - .register { - float: right; - } - } - } -} - -[data-theme='dark'] { - :host ::ng-deep { - .icon { - color: rgba(255, 255, 255, 0.2); - &:hover { - color: #fff; - } - } - } -} diff --git a/src/app/routes/passport/login/login.component.ts b/src/app/routes/passport/login/login.component.ts deleted file mode 100644 index 99300009..00000000 --- a/src/app/routes/passport/login/login.component.ts +++ /dev/null @@ -1,213 +0,0 @@ -import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, OnDestroy, Optional } from '@angular/core'; -import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { Router } from '@angular/router'; -import { StartupService } from '@core'; -import { ReuseTabService } from '@delon/abc/reuse-tab'; -import { DA_SERVICE_TOKEN, ITokenService, SocialOpenType, SocialService } from '@delon/auth'; -import { SettingsService, _HttpClient } from '@delon/theme'; -import { environment } from '@env/environment'; -import { NzTabChangeEvent } from 'ng-zorro-antd/tabs'; -import { finalize } from 'rxjs/operators'; - -@Component({ - selector: 'passport-login', - templateUrl: './login.component.html', - styleUrls: ['./login.component.less'], - providers: [SocialService], - changeDetection: ChangeDetectionStrategy.OnPush -}) -export class UserLoginComponent implements OnDestroy { - constructor( - fb: FormBuilder, - private router: Router, - private settingsService: SettingsService, - private socialService: SocialService, - @Optional() - @Inject(ReuseTabService) - private reuseTabService: ReuseTabService, - @Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService, - private startupSrv: StartupService, - private http: _HttpClient, - private cdr: ChangeDetectorRef - ) { - this.form = fb.group({ - userName: [null, [Validators.required]], - password: [null, [Validators.required]], - mobile: [null, [Validators.required, Validators.pattern(/^1\d{10}$/)]], - captcha: [null, [Validators.required]], - remember: [true] - }); - } - - // #region fields - - get userName(): AbstractControl { - return this.form.controls.userName; - } - get password(): AbstractControl { - return this.form.controls.password; - } - get mobile(): AbstractControl { - return this.form.controls.mobile; - } - get captcha(): AbstractControl { - return this.form.controls.captcha; - } - form: FormGroup; - error = ''; - type = 0; - loading = false; - - // #region get captcha - - count = 0; - interval$: any; - - // #endregion - - switch({ index }: NzTabChangeEvent): void { - this.type = index!; - } - - getCaptcha(): void { - if (this.mobile.invalid) { - this.mobile.markAsDirty({ onlySelf: true }); - this.mobile.updateValueAndValidity({ onlySelf: true }); - return; - } - this.count = 59; - this.interval$ = setInterval(() => { - this.count -= 1; - if (this.count <= 0) { - clearInterval(this.interval$); - } - }, 1000); - } - - // #endregion - - submit(): void { - this.error = ''; - if (this.type === 0) { - this.userName.markAsDirty(); - this.userName.updateValueAndValidity(); - this.password.markAsDirty(); - this.password.updateValueAndValidity(); - if (this.userName.invalid || this.password.invalid) { - return; - } - } else { - this.mobile.markAsDirty(); - this.mobile.updateValueAndValidity(); - this.captcha.markAsDirty(); - this.captcha.updateValueAndValidity(); - if (this.mobile.invalid || this.captcha.invalid) { - return; - } - } - - // 默认配置中对所有HTTP请求都会强制 [校验](https://ng-alain.com/auth/getting-started) 用户 Token - // 然一般来说登录请求不需要校验,因此可以在请求URL加上:`/login?_allow_anonymous=true` 表示不触发用户 Token 校验 - this.loading = true; - this.cdr.detectChanges(); - this.befaultLogin(); - return; - this.http - .post('/login/account?_allow_anonymous=true', { - type: this.type, - userName: this.userName.value, - password: this.password.value - }) - .pipe( - finalize(() => { - this.loading = true; - this.cdr.detectChanges(); - }) - ) - .subscribe(res => { - if (res.msg !== 'ok') { - this.error = res.msg; - this.cdr.detectChanges(); - return; - } - // 清空路由复用信息 - this.reuseTabService.clear(); - // 设置用户Token信息 - // TODO: Mock expired value - res.user.expired = +new Date() + 1000 * 60 * 5; - this.tokenService.set(res.user); - // 重新获取 StartupService 内容,我们始终认为应用信息一般都会受当前用户授权范围而影响 - this.startupSrv.load().then(() => { - let url = this.tokenService.referrer!.url || '/'; - if (url.includes('/passport')) { - url = '/'; - } - this.router.navigateByUrl(url); - }); - }); - } - - befaultLogin() { - // 清空路由复用信息 - this.reuseTabService.clear(); - // 设置用户Token信息 - // TODO: Mock expired value - // 重新获取 StartupService 内容,我们始终认为应用信息一般都会受当前用户授权范围而影响 - this.startupSrv.load().then(() => { - let url = this.tokenService.referrer!.url || '/'; - if (url.includes('/passport')) { - url = '/'; - } - this.router.navigateByUrl(url); - }); - } - - // #region social - - open(type: string, openType: SocialOpenType = 'href'): void { - let url = ``; - let callback = ``; - if (environment.production) { - callback = `https://ng-alain.github.io/ng-alain/#/passport/callback/${type}`; - } else { - callback = `http://localhost:4200/#/passport/callback/${type}`; - } - switch (type) { - case 'auth0': - url = `//cipchk.auth0.com/login?client=8gcNydIDzGBYxzqV0Vm1CX_RXH-wsWo5&redirect_uri=${decodeURIComponent(callback)}`; - break; - case 'github': - url = `//github.com/login/oauth/authorize?client_id=9d6baae4b04a23fcafa2&response_type=code&redirect_uri=${decodeURIComponent( - callback - )}`; - break; - case 'weibo': - url = `https://api.weibo.com/oauth2/authorize?client_id=1239507802&response_type=code&redirect_uri=${decodeURIComponent(callback)}`; - break; - } - if (openType === 'window') { - this.socialService - .login(url, '/', { - type: 'window' - }) - .subscribe(res => { - if (res) { - this.settingsService.setUser(res); - this.router.navigateByUrl('/'); - } - }); - } else { - this.socialService.login(url, '/', { - type: 'href' - }); - } - } - - // #endregion - - ngOnDestroy(): void { - if (this.interval$) { - clearInterval(this.interval$); - } - } -} diff --git a/src/app/routes/passport/login2/login2.component.html b/src/app/routes/passport/login2/login2.component.html deleted file mode 100644 index b07a7154..00000000 --- a/src/app/routes/passport/login2/login2.component.html +++ /dev/null @@ -1,56 +0,0 @@ - -
-
-
-

Work with us

-

Our researchers are embedded in teams across computer science, to discover, invent, and build at the largest - scale.

-
-
-
- -

注册

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
\ No newline at end of file diff --git a/src/app/routes/passport/login2/login2.component.less b/src/app/routes/passport/login2/login2.component.less deleted file mode 100644 index cc23d678..00000000 --- a/src/app/routes/passport/login2/login2.component.less +++ /dev/null @@ -1,28 +0,0 @@ -@import '~@delon/theme/index'; - -:host ::ng-deep { - .pro-passport__bg { - position: relative; - display: flex; - align-items: center; - padding: 48px; - @media (max-width: @screen-md-max) { - display: none !important; - } - .text { - position: relative; - padding: 0 64px; - color: #fff; - h1 { - margin-bottom: 24px; - color: #fff; - font-weight: 900; - font-size: 56px; - } - p { - font-size: 22px; - line-height: 32px; - } - } - } -} diff --git a/src/app/routes/passport/login2/login2.component.ts b/src/app/routes/passport/login2/login2.component.ts deleted file mode 100644 index 06b0d178..00000000 --- a/src/app/routes/passport/login2/login2.component.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { Router } from '@angular/router'; -import { _HttpClient } from '@delon/theme'; -import { NzMessageService } from 'ng-zorro-antd/message'; - -@Component({ - selector: 'passport-login2', - templateUrl: './login2.component.html', - styleUrls: ['./login2.component.less'], - host: { - '[class.ant-row]': 'true', - '[class.pro-passport]': 'true' - } -}) -export class UserLogin2Component implements OnDestroy { - form: FormGroup; - error = ''; - - constructor(fb: FormBuilder, private router: Router, private msg: NzMessageService, public http: _HttpClient) { - this.form = fb.group({ - mobilePrefix: ['+86'], - mobile: [null, [Validators.required, Validators.pattern(/^1\d{10}$/)]], - captcha: [null, [Validators.required]], - password: [null, [Validators.required, Validators.minLength(6)]] - }); - } - - // #region fields - - get password(): AbstractControl { - return this.form.controls.password; - } - get mobile(): AbstractControl { - return this.form.controls.mobile; - } - get captcha(): AbstractControl { - return this.form.controls.captcha; - } - - // #endregion - - // #region get captcha - - count = 0; - interval$: any; - - getCaptcha(): void { - if (this.mobile.invalid) { - this.mobile.markAsDirty({ onlySelf: true }); - this.mobile.updateValueAndValidity({ onlySelf: true }); - return; - } - this.count = 59; - this.interval$ = setInterval(() => { - this.count -= 1; - if (this.count <= 0) { - clearInterval(this.interval$); - } - }, 1000); - } - - // #endregion - - submit(): void { - this.error = ''; - const data = this.form.value; - this.http.post('/register', data).subscribe(() => { - this.router.navigate(['passport', 'register-result'], { queryParams: { email: data.mail } }); - }); - } - - ngOnDestroy(): void { - if (this.interval$) { - clearInterval(this.interval$); - } - } -} diff --git a/src/app/routes/passport/login3/login3.component.html b/src/app/routes/passport/login3/login3.component.html deleted file mode 100644 index 3ec68a6e..00000000 --- a/src/app/routes/passport/login3/login3.component.html +++ /dev/null @@ -1,51 +0,0 @@ - -
-
-
- -

注册

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
\ No newline at end of file diff --git a/src/app/routes/passport/login3/login3.component.less b/src/app/routes/passport/login3/login3.component.less deleted file mode 100644 index 63bf91c6..00000000 --- a/src/app/routes/passport/login3/login3.component.less +++ /dev/null @@ -1,13 +0,0 @@ -@import '~@delon/theme/index'; - -:host ::ng-deep { - .pro-passport { - &__form { - position: relative; - max-width: 380px; - margin: 48px auto 0 auto; - background: #fff; - border-radius: 4px; - } - } -} diff --git a/src/app/routes/passport/login3/login3.component.ts b/src/app/routes/passport/login3/login3.component.ts deleted file mode 100644 index 641e079c..00000000 --- a/src/app/routes/passport/login3/login3.component.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { Router } from '@angular/router'; -import { _HttpClient } from '@delon/theme'; -import { NzMessageService } from 'ng-zorro-antd/message'; - -@Component({ - selector: 'passport-login3', - templateUrl: './login3.component.html', - styleUrls: ['./login3.component.less'], - host: { - '[class.ant-row]': 'true', - '[class.pro-passport]': 'true' - } -}) -export class UserLogin3Component implements OnDestroy { - form: FormGroup; - error = ''; - - constructor(fb: FormBuilder, private router: Router, private msg: NzMessageService, public http: _HttpClient) { - this.form = fb.group({ - mobilePrefix: ['+86'], - mobile: [null, [Validators.required, Validators.pattern(/^1\d{10}$/)]], - captcha: [null, [Validators.required]], - password: [null, [Validators.required, Validators.minLength(6)]] - }); - } - - // #region fields - - get password(): AbstractControl { - return this.form.controls.password; - } - get mobile(): AbstractControl { - return this.form.controls.mobile; - } - get captcha(): AbstractControl { - return this.form.controls.captcha; - } - - // #endregion - - // #region get captcha - - count = 0; - interval$: any; - - getCaptcha(): void { - if (this.mobile.invalid) { - this.mobile.markAsDirty({ onlySelf: true }); - this.mobile.updateValueAndValidity({ onlySelf: true }); - return; - } - this.count = 59; - this.interval$ = setInterval(() => { - this.count -= 1; - if (this.count <= 0) { - clearInterval(this.interval$); - } - }, 1000); - } - - // #endregion - - submit(): void { - this.error = ''; - const data = this.form.value; - this.http.post('/register', data).subscribe(() => { - this.router.navigate(['passport', 'register-result'], { queryParams: { email: data.mail } }); - }); - } - - ngOnDestroy(): void { - if (this.interval$) { - clearInterval(this.interval$); - } - } -} diff --git a/src/app/routes/passport/passport-routing.module.ts b/src/app/routes/passport/passport-routing.module.ts index ba8032bd..7ec781a9 100644 --- a/src/app/routes/passport/passport-routing.module.ts +++ b/src/app/routes/passport/passport-routing.module.ts @@ -2,13 +2,9 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { LayoutPassportComponent } from '../../layout/passport/passport.component'; -import { CallbackComponent } from './callback.component'; -import { UserLockComponent } from './lock/lock.component'; -import { UserLoginComponent } from './login/login.component'; -import { UserLogin2Component } from './login2/login2.component'; -import { UserLogin3Component } from './login3/login3.component'; -import { UserRegisterResultComponent } from './register-result/register-result.component'; -import { UserRegisterComponent } from './register/register.component'; +import { UserLoginComponent } from './components/login/login.component'; +import { OrderAgreementComponent } from './components/order-agreement/order-agreement.component'; +import { UserRetrievePasswordComponent } from './components/retrieve-password/retrieve-password.component'; const routes: Routes = [ // passport @@ -17,31 +13,22 @@ const routes: Routes = [ component: LayoutPassportComponent, children: [ { - path: 'login', - component: UserLoginComponent, - data: { title: '登录' } + path: 'agreement', + component: OrderAgreementComponent, + data: { title: '协议' } }, { - path: 'register', - component: UserRegisterComponent, - data: { title: '注册' } - }, - { - path: 'register-result', - component: UserRegisterResultComponent, - data: { title: '注册结果' } - }, - { - path: 'lock', - component: UserLockComponent, - data: { title: '锁屏' } + path: 'retrieve-password', + component: UserRetrievePasswordComponent, + data: { title: '忘记密码' } } ] }, - // 单页不包裹Layout - { path: 'login2', component: UserLogin2Component }, - { path: 'login3', component: UserLogin3Component }, - { path: 'passport/callback/:type', component: CallbackComponent } + { + path: 'passport/login', + component: UserLoginComponent, + data: { title: '登录' } + } ]; @NgModule({ diff --git a/src/app/routes/passport/passport.module.ts b/src/app/routes/passport/passport.module.ts index 964929bc..e4ab74be 100644 --- a/src/app/routes/passport/passport.module.ts +++ b/src/app/routes/passport/passport.module.ts @@ -3,6 +3,8 @@ import { NgModule } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { ResultModule } from '@delon/abc/result'; import { SEModule } from '@delon/abc/se'; +import { DelonACLModule } from '@delon/acl'; +import { DelonFormModule } from '@delon/form'; import { AlainThemeModule } from '@delon/theme'; import { NzAlertModule } from 'ng-zorro-antd/alert'; import { NzAvatarModule } from 'ng-zorro-antd/avatar'; @@ -15,28 +17,21 @@ import { NzInputModule } from 'ng-zorro-antd/input'; import { NzPopoverModule } from 'ng-zorro-antd/popover'; import { NzProgressModule } from 'ng-zorro-antd/progress'; import { NzSelectModule } from 'ng-zorro-antd/select'; +import { NzStepsModule } from 'ng-zorro-antd/steps'; import { NzTabsModule } from 'ng-zorro-antd/tabs'; import { NzToolTipModule } from 'ng-zorro-antd/tooltip'; +import { ProPageModule } from 'src/app/layout/pro/shared/page'; +import { UserLoginComponent } from './components/login/login.component'; +import { OrderAgreementComponent } from './components/order-agreement/order-agreement.component'; +import { UserRetrievePasswordComponent } from './components/retrieve-password/retrieve-password.component'; -import { CallbackComponent } from './callback.component'; -import { UserLockComponent } from './lock/lock.component'; -import { UserLoginComponent } from './login/login.component'; -import { UserLogin2Component } from './login2/login2.component'; -import { UserLogin3Component } from './login3/login3.component'; import { PassportRoutingModule } from './passport-routing.module'; -import { UserRegisterResultComponent } from './register-result/register-result.component'; -import { UserRegisterComponent } from './register/register.component'; const COMPONENTS = [ // passport pages UserLoginComponent, - UserRegisterComponent, - UserRegisterResultComponent, - UserLockComponent, - // single pages - UserLogin2Component, - UserLogin3Component, - CallbackComponent + UserRetrievePasswordComponent, + OrderAgreementComponent ]; @NgModule({ @@ -60,7 +55,11 @@ const COMPONENTS = [ NzProgressModule, NzAvatarModule, SEModule, - ResultModule + ResultModule, + DelonACLModule, + DelonFormModule, + NzStepsModule, + ProPageModule, ], declarations: COMPONENTS }) diff --git a/src/app/routes/passport/register-result/register-result.component.html b/src/app/routes/passport/register-result/register-result.component.html deleted file mode 100644 index 1d637c6a..00000000 --- a/src/app/routes/passport/register-result/register-result.component.html +++ /dev/null @@ -1,13 +0,0 @@ - - -
- 你的账户:{{params?.email}} 注册成功 -
-
- - -
\ No newline at end of file diff --git a/src/app/routes/passport/register-result/register-result.component.ts b/src/app/routes/passport/register-result/register-result.component.ts deleted file mode 100644 index a5a7cbc0..00000000 --- a/src/app/routes/passport/register-result/register-result.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Component } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { NzMessageService } from 'ng-zorro-antd/message'; - -@Component({ - selector: 'passport-register-result', - templateUrl: './register-result.component.html' -}) -export class UserRegisterResultComponent { - params = { email: '' }; - email = ''; - constructor(route: ActivatedRoute, public msg: NzMessageService) { - this.params.email = this.email = route.snapshot.queryParams.email || 'ng-alain@example.com'; - } -} diff --git a/src/app/routes/passport/register/register.component.html b/src/app/routes/passport/register/register.component.html deleted file mode 100644 index 61d3d43f..00000000 --- a/src/app/routes/passport/register/register.component.html +++ /dev/null @@ -1,89 +0,0 @@ -

注册

-
- - - - - - - - 请输入邮箱地址! - 邮箱地址格式错误! - - - - - - - - - -
- -
强度:强
-
强度:中
-
强度:太短
-
-
- -
-

请至少输入 6 个字符。请不要使用容易被猜到的密码。

-
-
-
-
- - - - - - - 请确认密码! - 两次输入的密码不匹配! - - - - - - - - - - - - - - - - 请输入手机号! - 手机号格式错误! - - - - - - - - - - - - - - - - - - - - - -
\ No newline at end of file diff --git a/src/app/routes/passport/register/register.component.less b/src/app/routes/passport/register/register.component.less deleted file mode 100644 index 6836413b..00000000 --- a/src/app/routes/passport/register/register.component.less +++ /dev/null @@ -1,42 +0,0 @@ -@import '~@delon/theme/index'; -:host { - display: block; - width: 368px; - margin: 0 auto; - ::ng-deep { - h3 { - margin-bottom: 20px; - font-size: 16px; - } - .submit { - width: 50%; - } - .login { - float: right; - line-height: @btn-height-lg; - } - } -} -::ng-deep { - .register-password-cdk { - .success, - .warning, - .error { - transition: color 0.3s; - } - .success { - color: @success-color; - } - .warning { - color: @warning-color; - } - .error { - color: @error-color; - } - .progress-pass > .progress { - .ant-progress-bg { - background-color: @warning-color; - } - } - } -} diff --git a/src/app/routes/passport/register/register.component.ts b/src/app/routes/passport/register/register.component.ts deleted file mode 100644 index 701f05d0..00000000 --- a/src/app/routes/passport/register/register.component.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; -import { AbstractControl, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; -import { Router } from '@angular/router'; -import { _HttpClient } from '@delon/theme'; -import { MatchControl } from '@delon/util/form'; -import { NzSafeAny } from 'ng-zorro-antd/core/types'; -import { finalize } from 'rxjs/operators'; - -@Component({ - selector: 'passport-register', - templateUrl: './register.component.html', - styleUrls: ['./register.component.less'], - changeDetection: ChangeDetectionStrategy.OnPush -}) -export class UserRegisterComponent implements OnDestroy { - constructor(fb: FormBuilder, private router: Router, private http: _HttpClient, private cdr: ChangeDetectorRef) { - this.form = fb.group( - { - mail: [null, [Validators.required, Validators.email]], - password: [null, [Validators.required, Validators.minLength(6), UserRegisterComponent.checkPassword.bind(this)]], - confirm: [null, [Validators.required, Validators.minLength(6)]], - mobilePrefix: ['+86'], - mobile: [null, [Validators.required, Validators.pattern(/^1\d{10}$/)]], - captcha: [null, [Validators.required]] - }, - { - validators: MatchControl('password', 'confirm') - } - ); - } - - // #region fields - - get mail(): AbstractControl { - return this.form.controls.mail; - } - get password(): AbstractControl { - return this.form.controls.password; - } - get confirm(): AbstractControl { - return this.form.controls.confirm; - } - get mobile(): AbstractControl { - return this.form.controls.mobile; - } - get captcha(): AbstractControl { - return this.form.controls.captcha; - } - form: FormGroup; - error = ''; - type = 0; - loading = false; - visible = false; - status = 'pool'; - progress = 0; - passwordProgressMap: { [key: string]: 'success' | 'normal' | 'exception' } = { - ok: 'success', - pass: 'normal', - pool: 'exception' - }; - - // #endregion - - // #region get captcha - - count = 0; - interval$: any; - - static checkPassword(control: FormControl): NzSafeAny { - if (!control) { - return null; - } - // eslint-disable-next-line @typescript-eslint/no-this-alias - const self: any = this; - self.visible = !!control.value; - if (control.value && control.value.length > 9) { - self.status = 'ok'; - } else if (control.value && control.value.length > 5) { - self.status = 'pass'; - } else { - self.status = 'pool'; - } - - if (self.visible) { - self.progress = control.value.length * 10 > 100 ? 100 : control.value.length * 10; - } - } - - getCaptcha(): void { - if (this.mobile.invalid) { - this.mobile.markAsDirty({ onlySelf: true }); - this.mobile.updateValueAndValidity({ onlySelf: true }); - return; - } - this.count = 59; - this.cdr.detectChanges(); - this.interval$ = setInterval(() => { - this.count -= 1; - this.cdr.detectChanges(); - if (this.count <= 0) { - clearInterval(this.interval$); - } - }, 1000); - } - - // #endregion - - submit(): void { - this.error = ''; - Object.keys(this.form.controls).forEach(key => { - this.form.controls[key].markAsDirty(); - this.form.controls[key].updateValueAndValidity(); - }); - if (this.form.invalid) { - return; - } - - const data = this.form.value; - this.loading = true; - this.cdr.detectChanges(); - this.http - .post('/register?_allow_anonymous=true', data) - .pipe( - finalize(() => { - this.loading = false; - this.cdr.detectChanges(); - }) - ) - .subscribe(() => { - this.router.navigate(['passport', 'register-result'], { queryParams: { email: data.mail } }); - }); - } - - ngOnDestroy(): void { - if (this.interval$) { - clearInterval(this.interval$); - } - } -} diff --git a/src/app/routes/passport/services/passport.service.ts b/src/app/routes/passport/services/passport.service.ts new file mode 100644 index 00000000..08798739 --- /dev/null +++ b/src/app/routes/passport/services/passport.service.ts @@ -0,0 +1,17 @@ +import { Injectable, Injector } from '@angular/core'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { BaseService } from 'src/app/shared/services/core/base.service'; +import { EAFileUtil } from 'src/app/shared/utils/file.util'; + +@Injectable({ + providedIn: 'root' +}) +export class PassportService extends BaseService { + // 登录协议,服务订购协议 + public $api_get_agreement = `/scm/cms/cms/agreement/getAgreement?_allow_anonymous=true`; + + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/assets/images/user/login-image.png b/src/assets/images/user/login-image.png new file mode 100644 index 0000000000000000000000000000000000000000..73f109668d4124773b0b2dc0eb42c21fee22ef54 GIT binary patch literal 232500 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 z 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 Ef|b@kM*si- literal 0 HcmV?d00001 diff --git a/src/assets/images/user/logo.png b/src/assets/images/user/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e2d680a3425d17bdb1ef9a7d281fd71b4b4b0def GIT binary patch literal 2504 zcmV;(2{-nMP)Px;f=NU{RA@u(m;> zo0=}?|8@!a{C?W{T-0@|H1?<*>~hfD?V{1eOiQ| zlf*|T*I5JL^9N|_Q>i_s(qvVs?sRgfN2ST;qW1*-T1G_~gc$6p0G%-ae;|O(?xthF zeUkp#PL-N&Cw;0PkN1StItBfqWcb_e2^oOa{lg={?myV&q`K2VWru@?E)}ceyV3t` z!G-ewQv&e%{j~SF1pSRxm6{XX-((x1ci0oGQ;l{>3Rb}kU&0@2zfQ0g6)usVXd>JI zyIY+|x^JE;bq~4%8vQk0cJ{Y9gtpdoyXaGWXPtfxw{Y{C$mk%}q{k9zASc;GS!M+D zEiwhkCgvo{gd241thI6R=4K@Q7yuE!tq9mv|FpY*x=9y-`hr=FFzE$zW!Va=3t}ls zHS_eRoors8gLT+VTfdvVN9=sv;o#QgiCnwX!hqAmn&)fyqD>tqrIK`8#f&X9!PO`r zezXYnI*IgX0|iND=B1cfU@?=EU?x2#jMw&B8B%>H;d&aoRQ`Qvhz;i@@Uy%)a^g+= z?xQ25$A^siGJG;i0(02hay2OngDv7e5>{ug3=`tl53iDHBGUJSR zd=i7In`Lui=ouPe%?oujSVtJ~2FQ*!P?Dukniav;&#i1&p2+>Hvjn-C3~R0SdCLF> zoy3pl#;~Kx#$_)xjW4080GwKI&gafJaS1ocdbkpgx&gPGk?7{mu9Pz ztG3qj;jiX1C&A3p#}BZwFpfW6njIQ|(ZDlf!?^vYDfk0$|3@7Jd;wlqpT)-W(|GrQ zmG!S2!eEeyG3n@a_z*WDp@d8HJ+(~Ge(t7fzUp+cBtz!Qdl%t!`>1TUlapZLfgMNL zRX@Pd$4kZcHvFxbSFX#YvVE9KUaX_y?nPw8hVx-nFZn471u05s04z}kZaz1W;|>om zte;0k>j39HTTh~*r{NDJM4Jtq|8zA=vK4;6CX*w_T`YaFh8S5-ev*mOY=vj8%n|f2 zd!mZ{T`F2KZYWEjro+KwmuHJ$Zrauy1n^j?U|ra&hHL4ZMD1F6Si5+_bHcSHC!p))vj>#bn3JY<&9= zNs(ccUzEig`>b65`k`@3F)F!Q8Gdzt5lb?s2B7uHD;3?`wK9Wflb#lv1EXF~W}G=R z2G$kFvHj+}lMJYCA6q`_6bBBuJlwwhFmn@3%u6zJ?%W8v20UzhtA#5T$MevIXAVH~ zRnL6d$vvymh*OMQx}}biOoj4`GI_7k#=5N&2H8XvTE94sw|@BzfQr^ZUi_?^hcC{e zp+}q4Dpl=vnr$xZE+47UMtX+5Tu~BtS^z?NJpuMTSVUP?)RZNp+3cm8s%d$cW&#|jHSniIwKuQjs0a$uZ$oixaq{@>9%|Wosi|AyF|9 z9}z~RDU1hp92TQqE1_-sdbr`$LqV-R;ge&{I&N5+z~T&rwMFq5^b$92Yi4h&eNq!^ z0G2&f&3}F~p8?g+L;q-}AUPbT+fPToo87IB(@)}w4D4wc1@{t-St*w4#*dQU%ze^C<0+c$kvLK*;V>~Fnh z9=jU)`T6tpA_H1UyuTq&0J!Jj9Uk)jSg9>s!fLE5 ziRG5%DZF#Q#$}7*i8ATw9&*#rty0oiQqOS^&4?a(QtAcfQxkuDSt=Gh|A$ z6z*7&E`mI4Q)#h{(9-MTV5gI&9+i5l3!B3y9JCg6h;dG7ekTFAa#1Yr-g0UN{#D<{ zg_|3Qmkq*EK7aLGp$^x*)<{vROk$*wuLboEntELHt3F&B^;*45V^KeyRUftGk`7|b zhRG##DgdwVwes>c^B8h@u@1TM2mBoAb5nOr@zM2B3pCbjASKE`QMy8Lx*}w=&>|DBgrOMqAwO$IH?otS=fs|?(Qh8v$xR3+H$|o>O(8eQB Date: Mon, 29 Nov 2021 20:03:45 +0800 Subject: [PATCH 0003/1600] =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=B8=AD=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../routes/account/account-routing.module.ts | 2 - src/app/routes/account/account.module.ts | 4 +- .../edit-info/edit-info.component.html | 15 - .../edit-info/edit-info.component.less | 6 - .../edit-info/edit-info.component.spec.ts | 23 - .../edit-info/edit-info.component.ts | 207 --- .../edit-name/edit-name.component.ts | 1 + src/app/routes/routes-routing.module.ts | 8 +- .../freight/list/list.component.html | 77 + .../freight/list/list.component.spec.ts | 23 + .../components/freight/list/list.component.ts | 224 +++ .../freight/list/new/new.component.html | 109 ++ .../freight/list/new/new.component.less | 95 ++ .../freight/list/new/new.component.ts | 1400 +++++++++++++++++ .../freight/list/view/view.component.html | 49 + .../freight/list/view/view.component.less | 46 + .../freight/list/view/view.component.spec.ts | 23 + .../freight/list/view/view.component.ts | 257 +++ .../usercenter/services/usercenter.service.ts | 91 ++ .../usercenter/usercenter-routing.module.ts | 29 + .../routes/usercenter/usercenter.module.ts | 26 + src/app/shared/shared-zorro.module.ts | 17 +- src/assets/mocks/menu-data.json | 36 + src/style-icons-auto.ts | 5 +- 24 files changed, 2511 insertions(+), 262 deletions(-) delete mode 100644 src/app/routes/account/components/edit-info/edit-info.component.html delete mode 100644 src/app/routes/account/components/edit-info/edit-info.component.less delete mode 100644 src/app/routes/account/components/edit-info/edit-info.component.spec.ts delete mode 100644 src/app/routes/account/components/edit-info/edit-info.component.ts create mode 100644 src/app/routes/usercenter/components/freight/list/list.component.html create mode 100644 src/app/routes/usercenter/components/freight/list/list.component.spec.ts create mode 100644 src/app/routes/usercenter/components/freight/list/list.component.ts create mode 100644 src/app/routes/usercenter/components/freight/list/new/new.component.html create mode 100644 src/app/routes/usercenter/components/freight/list/new/new.component.less create mode 100644 src/app/routes/usercenter/components/freight/list/new/new.component.ts create mode 100644 src/app/routes/usercenter/components/freight/list/view/view.component.html create mode 100644 src/app/routes/usercenter/components/freight/list/view/view.component.less create mode 100644 src/app/routes/usercenter/components/freight/list/view/view.component.spec.ts create mode 100644 src/app/routes/usercenter/components/freight/list/view/view.component.ts create mode 100644 src/app/routes/usercenter/services/usercenter.service.ts create mode 100644 src/app/routes/usercenter/usercenter-routing.module.ts create mode 100644 src/app/routes/usercenter/usercenter.module.ts diff --git a/src/app/routes/account/account-routing.module.ts b/src/app/routes/account/account-routing.module.ts index c6412c83..f3e14b15 100644 --- a/src/app/routes/account/account-routing.module.ts +++ b/src/app/routes/account/account-routing.module.ts @@ -9,7 +9,6 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { AccountComponentsCenterComponent } from './components/center/center.component'; -import { AccountComponentsEditInfoComponent } from './components/edit-info/edit-info.component'; const routes: Routes = [ { path: '', redirectTo: 'center', pathMatch: 'full' }, @@ -21,7 +20,6 @@ const routes: Routes = [ titleI18n: 'app.my.center', }, }, - { path: 'editInfo', component: AccountComponentsEditInfoComponent }, ]; @NgModule({ diff --git a/src/app/routes/account/account.module.ts b/src/app/routes/account/account.module.ts index 5bfacc1a..b25127f7 100644 --- a/src/app/routes/account/account.module.ts +++ b/src/app/routes/account/account.module.ts @@ -1,7 +1,7 @@ /* * @Author: your name * @Date: 2021-11-29 11:06:01 - * @LastEditTime: 2021-11-29 15:04:25 + * @LastEditTime: 2021-11-29 15:42:10 * @LastEditors: Please set LastEditors * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: \tms-obc-web\src\app\routes\account\account.module.ts @@ -10,14 +10,12 @@ import { NgModule } from '@angular/core'; import { SharedModule } from '@shared'; import { AccountRoutingModule } from './account-routing.module'; import { AccountComponentsCenterComponent } from './components/center/center.component'; -import { AccountComponentsEditInfoComponent } from './components/edit-info/edit-info.component'; import { AccountComponentsEditNameComponent } from './components/edit-name/edit-name.component'; import { AccountComponentsCenterEditComponent } from './components/edit-password/edit-password.component'; const COMPONENTS = [ AccountComponentsCenterComponent, AccountComponentsEditNameComponent, - AccountComponentsEditInfoComponent, AccountComponentsCenterEditComponent ]; const COMPONENTS_NOROUNT = [AccountComponentsEditNameComponent]; diff --git a/src/app/routes/account/components/edit-info/edit-info.component.html b/src/app/routes/account/components/edit-info/edit-info.component.html deleted file mode 100644 index d40f4edc..00000000 --- a/src/app/routes/account/components/edit-info/edit-info.component.html +++ /dev/null @@ -1,15 +0,0 @@ -

- -
- -
- - - - - - -
-
-
-
diff --git a/src/app/routes/account/components/edit-info/edit-info.component.less b/src/app/routes/account/components/edit-info/edit-info.component.less deleted file mode 100644 index 9711336e..00000000 --- a/src/app/routes/account/components/edit-info/edit-info.component.less +++ /dev/null @@ -1,6 +0,0 @@ -:host { - .myForm { - width: 600px; - margin: 5rem auto; - } -} diff --git a/src/app/routes/account/components/edit-info/edit-info.component.spec.ts b/src/app/routes/account/components/edit-info/edit-info.component.spec.ts deleted file mode 100644 index a8f871cb..00000000 --- a/src/app/routes/account/components/edit-info/edit-info.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { OfficialWebsiteComponentsMemberEditInfoComponent } from './edit-info.component'; - -describe('OfficialWebsiteComponentsMemberEditInfoComponent', () => { - let component: OfficialWebsiteComponentsMemberEditInfoComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [OfficialWebsiteComponentsMemberEditInfoComponent], - }).compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(OfficialWebsiteComponentsMemberEditInfoComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/routes/account/components/edit-info/edit-info.component.ts b/src/app/routes/account/components/edit-info/edit-info.component.ts deleted file mode 100644 index 45b0121c..00000000 --- a/src/app/routes/account/components/edit-info/edit-info.component.ts +++ /dev/null @@ -1,207 +0,0 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { SFComponent, SFSchema, SFSelectWidgetSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form'; -import { ModalHelper, _HttpClient } from '@delon/theme'; -import { environment } from '@env/environment'; -import { Observable, Observer } from 'rxjs'; -import { AccountService } from '../../services/account.service'; - -@Component({ - selector: 'app-account-components-edit-info', - templateUrl: './edit-info.component.html', - styleUrls: ['./edit-info.component.less'], -}) -export class AccountComponentsEditInfoComponent implements OnInit { - @ViewChild('sf', { static: false }) - sf!: SFComponent; - i: any; - schema!: SFSchema; - ui!: SFUISchema; - formData: any = { - // avatar:[ - // { - // uid: -1, - // name: 'LOGO', - // status: 'done', - // url: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png', - // response: { - // url: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png', - // }, - // }, - // ], - // name:'西四' - }; - - constructor(public service: AccountService, private modal: ModalHelper, private route: ActivatedRoute) { - const { realName, identity } = route.snapshot?.queryParams; - Object.assign(this.formData, { realName, certificateNumber: identity }); - } - - ngOnInit() { - this.initSF(); - this.getInfo(); - } - initSF() { - this.schema = { - properties: { - avatar: { - type: 'string', - title: '头像', - ui: { - // action: environment.UPLOAD_URL, - fileType: 'image/png,image/jpeg,image/jpg,image/png,image/gif,image/bmp', - limit: 1, - limitFileCount: 1, - resReName: 'url', - urlReName: 'url', - widget: 'upload', - descriptionI18n: '支持JPG、GIF、PNG、JPEG、BMP格式,文件小于2M', - data: { - // appId: environment.appId, - }, - name: 'multipartFile', - multiple: false, - listType: 'picture-card', - change: (args) => { - if (args.type === 'success') { - const avatar = [ - { - uid: -1, - name: 'LOGO', - status: 'done', - url: args.fileList[0].response.url, - response: { - url: args.fileList[0].response.url, - }, - }, - ]; - this.sf?.setValue('/avatar', avatar); - } - }, - beforeUpload: (file: any, _fileList) => { - return new Observable((observer: Observer) => { - const isLt2M = file.size / 1024 / 1024 < 2; - if (!isLt2M) { - this.service.msgSrv.warning('图片大小超过2M!'); - observer.complete(); - return; - } - observer.next(isLt2M); - observer.complete(); - }); - }, - } as SFUploadWidgetSchema, - }, - name: { - title: '用户名', - type: 'string', - ui: { - widget: 'text', - }, - }, - phone: { - title: '手机号', - type: 'string', - ui: { - widget: 'text', - }, - }, - nickName: { - title: '昵称', - type: 'string', - minLength: 1, - maxLength: 18, - ui: { - placeholder: '请输入昵称', - errors: { - required: '请输入昵称', - }, - }, - }, - sex: { - title: '性别', - type: 'string', - default: 0, - enum: [ - { label: '未知', value: 0 }, - { label: '男', value: 1 }, - { label: '女', value: 2 }, - { label: '保密', value: 3 }, - ], - ui: { - widget: 'select', - } as SFSelectWidgetSchema, - }, - birthday: { - title: '生日', - type: 'string', - format: 'date', - }, - realName: { - title: '真实姓名', - type: 'string', - ui: { - widget: 'text', - optionalHelp: '实名认证渠道来自供应商入驻,仅在用户同意的情况下,合理用于相关业务,且平台有义务保障您的信息安全。', - }, - }, - certificateNumber: { - title: '身份证号码', - type: 'string', - ui: { - widget: 'text', - }, - }, - }, - required: ['nickName', 'sex', 'avatar'], - }; - this.ui = { - '*': { - spanLabel: 5, - grid: { span: 24 }, - }, - }; - } - getInfo() { - const params = { - // id: this.i.id, - }; - // this.service.http.post(this.service.$api_get_current_user_detail, params).subscribe((res) => { - // this.formData = res.data; - // if (!res.data.birthday) { - // this.formData.birthday = Date; - // } - // this.formData.avatar = [ - // { - // uid: -1, - // name: 'LOGO', - // status: 'done', - // url: res.data.avatar, - // response: { - // url: res.data.avatar, - // }, - // }, - // ]; - // this.formData.realName = this.route.snapshot.queryParams.realName; - // // this.formData.phone = this.route.snapshot.queryParams.phone; - // this.formData.certificateNumber = this.route.snapshot.queryParams.certificateNumber; - // this.initSF(); - // }); - } - formSubmit() { - const params: any = { - ...this.sf.value, - }; - delete params.realName; - delete params.certificateNumber; - // this.service.http.post(this.service.$api_updateUserInfo, params).subscribe((res) => { - // if (res.data) { - // this.service.msgSrv.success('修改成功'); - // this.goBack(); - // } - // }); - } - goBack() { - history.go(-1); - } -} diff --git a/src/app/routes/account/components/edit-name/edit-name.component.ts b/src/app/routes/account/components/edit-name/edit-name.component.ts index 14e9686f..28a6dc63 100644 --- a/src/app/routes/account/components/edit-name/edit-name.component.ts +++ b/src/app/routes/account/components/edit-name/edit-name.component.ts @@ -14,6 +14,7 @@ import { AccountService } from '../../services/account.service'; }) export class AccountComponentsEditNameComponent implements OnInit, AfterViewInit { // @ViewChild('dun', { static: false }) + url = `/rule?_allow_anonymous=true`; // private dun!: CaptchaComponent; @ViewChild('sf', { static: false }) sf!: SFComponent; record: any = {}; diff --git a/src/app/routes/routes-routing.module.ts b/src/app/routes/routes-routing.module.ts index 7726d684..351f4ee8 100644 --- a/src/app/routes/routes-routing.module.ts +++ b/src/app/routes/routes-routing.module.ts @@ -1,8 +1,8 @@ /* * @Author: your name * @Date: 2021-11-29 10:20:33 - * @LastEditTime: 2021-11-29 11:05:20 - * @LastEditors: your name + * @LastEditTime: 2021-11-29 15:38:35 + * @LastEditors: Please set LastEditors * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: \tms-obc-web\src\app\routes\routes-routing.module.ts */ @@ -27,6 +27,10 @@ const routes: Routes = [ path: 'account', loadChildren: () => import('./account/account.module').then((m) => m.AccountModule), }, + { + path: 'usercenter', + loadChildren: () => import('./usercenter/usercenter.module').then((m) => m.UsercenterModule), + }, ] }, // passport diff --git a/src/app/routes/usercenter/components/freight/list/list.component.html b/src/app/routes/usercenter/components/freight/list/list.component.html new file mode 100644 index 00000000..1619105e --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/list.component.html @@ -0,0 +1,77 @@ + + + + + + +
+ +
+ + +
+ + + + +
+ +
+
+ + + + + +
+
+
+
+ + + + + + +
+
+ {{ item.enterpriseName }} +
+
+
+ + 冻结 + 正常 + +
+
diff --git a/src/app/routes/usercenter/components/freight/list/list.component.spec.ts b/src/app/routes/usercenter/components/freight/list/list.component.spec.ts new file mode 100644 index 00000000..e695c14a --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/list.component.spec.ts @@ -0,0 +1,23 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { FreightComponentsListComponent } from './list.component'; + +describe('FreightComponentsListComponent', () => { + let component: FreightComponentsListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FreightComponentsListComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FreightComponentsListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/usercenter/components/freight/list/list.component.ts b/src/app/routes/usercenter/components/freight/list/list.component.ts new file mode 100644 index 00000000..7fff418c --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/list.component.ts @@ -0,0 +1,224 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STColumnBadge, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { UsermanageService } from '../../../services/usercenter.service'; +@Component({ + selector: 'app-Freight-components-list', + templateUrl: './list.component.html', +}) +export class FreightComponentsListComponent implements OnInit { + _$expand = false; + url = `/rule?_allow_anonymous=true`; + + ui!: SFUISchema; + schema!: SFSchema; + columns!: STColumn[]; + datalist = [ + { + storeName: '企业名称', + contactsName: '152746565', + enterpriseName: '湖南', + unifiedSocialCreditCode: '45454', + contactsPhone: '*97889461561', + effectiveDateStr: '废弃eww', + enStatusStr2: '正常', + enStatusStr3: '正常', + unifiedSocialCreditCode3: '常用服务', + unifiedSocialCreditCode2: '正常', + tenantId: 1 + }, + { + storeName: '企业名称', + contactsName: '152746565', + enterpriseName: '湖南', + unifiedSocialCreditCode: '45454', + contactsPhone: '*97889461561', + effectiveDateStr: '废弃eww', + enStatusStr2: '正常', + enStatusStr3: '正常', + unifiedSocialCreditCode3: '常用服务', + unifiedSocialCreditCode2: '正常', + tenantId: 2 + }, + ] + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + + constructor(public service: UsermanageService, private modal: NzModalService, private router: Router, private ar: ActivatedRoute) {} + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + + /** + * 查询参数 + */ + get reqParams() { + const params: any = { + ...(this.sf && this.sf.value), + }; + if (this.sf?.value.effectiveDate) { + params.effectiveDateStart = this.sf?.value.effectiveDate[0]; + params.effectiveDateEnd = this.sf?.value.effectiveDate[1]; + } + delete params.effectiveDate; + delete params.expand; + return params; + } + + get selectedRows() { + return this.st?.list.filter((item) => item.checked) || []; + } + + ngOnInit() { + this.initSF(); + this.initST(); + this.ar.url.subscribe((params) => { + this.st?.load(1); + }); + } + dataProcess(data: STData[]): STData[] { + return data.map((i, index) => { + i.showSortFlag = false; + return i; + }); + } + initSF() { + this.schema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true, + }, + }, + storeName: { title: '企业名称', type: 'string', ui: { showRequired: false } }, + contactsName: { + title: '联系人', + type: 'string', + ui: { + showRequired: false, + }, + }, + unifiedSocialCreditCode: { + title: '税源地', + type: 'string', + ui: { + showRequired: false, + }, + }, + enStatus: { + type: 'string', + title: '货主状态', + enum: [ + { label: '全部', value: '' }, + { label: '正常', value: 0 }, + { label: '冻结', value: 1 }, + { label: '废弃', value: 2 }, + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value, + }, + }, + }, + enStatus2: { + type: 'string', + title: 'CRM审核状态', + enum: [ + { label: '全部', value: '' }, + { label: '正常', value: 0 }, + { label: '冻结', value: 1 }, + { label: '废弃', value: 2 }, + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value, + }, + }, + }, + }, + }; + this.ui = { '*': { spanLabelFixed: 90, grid: { span: 8, gutter: 4 }, enter: () => this.st.load() } }; + } + + initST() { + this.columns = [ + // { title: '', type: 'checkbox', className: 'text-center' }, + { title: '企业名称', className: 'text-center', index: 'storeName' }, + { title: '联系人', className: 'text-center', index: 'contactsName' }, + { title: '税源地', className: 'text-center', render: 'enterpriseName' }, + { title: '累计运单金额', className: 'text-center', index: 'unifiedSocialCreditCode' }, + { title: '道运证', className: 'text-center', index: 'contactsPhone' }, + { title: '企业状态', className: 'text-center', index: 'effectiveDateStr', + type: 'badge', + badge: { + 正常: { text: '正常', color: 'success' }, + 冻结: { text: '冻结', color: 'warning' }, + 废弃: { text: '废弃', color: 'default' }, + }, + }, + { + title: 'CRM审核状态', + className: 'text-center', + index: 'enStatusStr2', + type: 'badge', + badge: { + 正常: { text: '正常', color: 'success' }, + 冻结: { text: '冻结', color: 'warning' }, + 废弃: { text: '废弃', color: 'default' }, + }, + }, + { + title: '代收权限', + className: 'text-center', + index: 'enStatusStr3', + type: 'badge', + badge: { + 正常: { text: '正常', color: 'success' }, + 冻结: { text: '冻结', color: 'warning' }, + 废弃: { text: '废弃', color: 'default' }, + }, + }, + { title: '常用服务', className: 'text-center', index: 'unifiedSocialCreditCode3' }, + { title: '推广业务员', className: 'text-center', index: 'unifiedSocialCreditCode2' }, + { + title: '操作', + width: '170px', + className: 'text-center', + buttons: [ + { + text: '查看', + click: (item) => { + this.router.navigate(['./view', item.tenantId], { relativeTo: this.ar }); + // this.router.navigate(['./view', item.id], { relativeTo: this.ar, queryParams: { tenantId: item.tenantId } }); + }, + }, + ], + }, + ]; + } + + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + creat() { + this.router.navigate(['./new',], { relativeTo: this.ar }); + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } +} diff --git a/src/app/routes/usercenter/components/freight/list/new/new.component.html b/src/app/routes/usercenter/components/freight/list/new/new.component.html new file mode 100644 index 00000000..fe0400fa --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/new/new.component.html @@ -0,0 +1,109 @@ + + + + + +
营业执照基本信息
+
+ +
营业执照法人信息
+
+ +
+ 请上传营业执照原件的高清照片,若上传复印件,则需加盖公司印章; +
上传后系统会自动识别并填写
+
+
+ +
万元
+
+ + +
+
请上传身份证原件的高清照片,若上传复印件,则需申请人签字;
+
上传后系统会自动识别并填写
+
+
+ +
+
+
正面照(人像面)
+
示例
+
+
+
+
+ +
+
+
背面照(国徽面)
+
示例
+
+
+
+
+ +
+ + +
公司其他补充信息
+
+ +
企业管理员信息
+
+ + +
+
请上传该企业授权您成为本系统企业管理员的文件的高清照片,需加盖公司印章
+
上传后系统会自动识别并填写
+
+
+
+ +
+
+
+
示例
+
+
+
+
+ +
+
{{ telephone }} 默认当前登录账号绑定的手机号
+
+
+ +
+
请上传身份证原件的高清照片,若上传复印件,则需申请人签字;
+
上传后系统会自动识别并填写
+
+
+ +
+
+
正面照(人像面)
+
示例
+
+
+
+
+ +
+
+
背面照(国徽面)
+
示例
+
+
+
+
+ +
+ + +
+ + +
+
+
diff --git a/src/app/routes/usercenter/components/freight/list/new/new.component.less b/src/app/routes/usercenter/components/freight/list/new/new.component.less new file mode 100644 index 00000000..1014aacf --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/new/new.component.less @@ -0,0 +1,95 @@ +:host { + ::ng-deep { + nz-card { + .page-title { + margin-bottom: 39px; + color: #333; + font-weight: 500; + font-size: 20px; + line-height: 28px; + text-align: center; + } + .step-title { + display: block; + width: 800px !important; + margin: 0 auto; + } + + .myForm { + width: 680px; + margin: 5rem auto; + } + + .steps-content { + min-height: 250px; + } + + .btn-submit { + margin-top: 16px; + } + .pr { + position: relative; + } + .pa { + position: absolute; + top: 35px; + left: 150px; + } + .tips { + display: flex; + margin-bottom: 0; + color: #333; + dt { + width: 150px; + } + dd { + width: 190px; + margin-bottom: 0; + text-align: center; + } + } + .form-title { + margin-bottom: 10px; + padding-left: 8px; + color: #333; + font-weight: 700; + font-size: 18px; + line-height: 20px; + border-left: solid 3px #1890ff; + } + .form-content { + padding: 48px 32px; + } + .apply-sv { + margin: 16px 0; + padding: 20px; + background: #f8f8f8; + border-radius: 2px; + } + .result-date { + font-size: 12px; + } + .result-tips { + color: #ff4d4f; + font-size: 14px; + } + .sv-img { + display: inline-block; + width: 104px; + height: 104px; + margin-right: 20px; + padding: 8px; + background: #fff; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 2px; + img { + width: 100%; + height: 100%; + } + } + } + /deep/ .ant-row { + margin-left: 100px; + } + } +} diff --git a/src/app/routes/usercenter/components/freight/list/new/new.component.ts b/src/app/routes/usercenter/components/freight/list/new/new.component.ts new file mode 100644 index 00000000..df20847f --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/new/new.component.ts @@ -0,0 +1,1400 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { apiConf } from '@conf/api.conf'; +import { + SFCascaderWidgetSchema, + SFCheckboxWidgetSchema, + SFComponent, + SFDateWidgetSchema, + SFSchema, + SFSchemaEnum, + SFSelectWidgetSchema, + SFTextareaWidgetSchema, + SFUISchema, + SFUploadWidgetSchema, +} from '@delon/form'; +import { ModalHelper } from '@delon/theme'; +import { EnvironmentService } from '@env/environment.service'; +import { NzCascaderOption } from 'ng-zorro-antd/cascader'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +// import { AccountService } from '../../services/account.service'; +// import { AccountComponentsImgViewComponent } from '../img-view/img-view.component'; + +@Component({ + selector: 'app-account-components-freight-new', + templateUrl: './new.component.html', + styleUrls: ['./new.component.less'], +}) +export class FreightComponentsListNewComponent implements OnInit { + url = `/rule?_allow_anonymous=true`; + + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('sf1', { static: false }) + sf1!: SFComponent; + // @ViewChild('sf2', { static: false }) + // sf2!: SFComponent; + // @ViewChild('sf3', { static: false }) + // sf3!: SFComponent; + telephone = ''; + record: any = {}; + i: any; + schema!: SFSchema; + schema1!: SFSchema; + // schema2!: SFSchema; + // schema3!: SFSchema; + ui!: SFUISchema; + + id!: string; + isEdit!: boolean; + subStep = 0; + infoData: any = {}; + infoData1: any = {}; + infoData2: any = { + accountName: '', + }; + infoData3: any = {}; + branchBankName = ''; + bankArea = ''; + bankName = ''; + bankLogoUrl = ''; + bankRegion: any[] = []; + branchBanks: any[] = []; + signingPeriod = 2; + pdfSrc: any; + result = true; + enterpriseAddressCodeStr = ''; + enterpriseAddressCode: any; + enterpriseBusinessAddressCodeStr = ''; + enterpriseBusinessAddressCode = ''; + taxpayerTypeStr = ''; + regionData: any = []; + aptitudes: any = []; + constructor( + private routerinfo: ActivatedRoute, + public msg: NzMessageService, + private router: Router, + private modalService: NzModalService, + private modal: ModalHelper, + ) {} + ngOnInit() { + this.id = this.routerinfo.snapshot.queryParams.id; + + if (this.routerinfo.snapshot.queryParams.id) { + this.isEdit = true; + this.getApplicationInfo(this.routerinfo.snapshot.queryParams.id); + } else { + this.getUserDetail(); + } + this.initSF(); + } + initSF() { + this.schema = { + properties: { + title1: { + title: '', + type: 'string', + ui: { + widget: 'custom', + }, + }, + + // tipsE: { + // title: '', + // type: 'string', + // ui: { + // widget: 'custom', + // offsetControl: 6, + // }, + // }, + tipsD: { + title: '企业授权函', + type: 'string', + ui: { + widget: 'custom', + }, + }, + tipsE: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + certificatePhotoFront2: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.fileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: this.envSrv.getEnvironment().appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + this.checkIdCard(args.fileList[0].response.url, 0, 1); + } + }, + } as SFUploadWidgetSchema, + }, + region2: { + type: 'number', + title: '常用服务', + enum: this.regionData, + // default: [110000, 110100, 110105], + ui: { + width: 700, + widget: 'cascader', + valueProperty: 'regionCode', + labelProperty: 'name', + change: (ngModel: string | any[]) => { + const len = ngModel.length - 1; + this.enterpriseAddressCode = ngModel[len]; + // this.getRegionDetailByCode(ngModel[len],'name', 1); // 获取省市区名称 + }, + selectionChange: (values: NzCascaderOption[]) => { + // 获取省市区名称 + const len = values.length - 1; + this.enterpriseAddressCodeStr = values[len].regionFullName.split(',').reverse().join(''); + }, + }, + }, + contactsName: { + title: '推广业务员手机号', + type: 'string', + minLength: 1, + maxLength: 32, + ui: { + width: 700, + placeholder: '请输入您的真实姓名', + errors: { + required: '请输入您的真实姓名', + }, + }, + }, + title99: { + title: '', + type: 'string', + ui: { + widget: 'custom', + }, + }, + tipsA: { + title: '企业管理员证件照', + type: 'string', + ui: { + widget: 'custom', + }, + }, + certificatePhotoFront: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.fileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: this.envSrv.getEnvironment().appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + this.checkIdCard(args.fileList[0].response.url, 0, 1); + } + }, + } as SFUploadWidgetSchema, + }, + tipsB: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + certificatePhotoBack: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.fileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: this.envSrv.getEnvironment().appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + this.checkIdCard(args.fileList[0].response.url, 1, 1); + } + }, + } as SFUploadWidgetSchema, + }, + name: { + title: '企业管理员姓名', + type: 'string', + maxLength: 8, + ui: { + width: 700, + placeholder: '请输入营业执照上的企业管理员姓名', + }, + }, + certificateNumber: { + title: '企业管理员身份证号', + type: 'string', + format: 'id-card', + minLength: 1, + maxLength: 18, + ui: { + width: 700, + placeholder: '请输入法定代表人身份证号码', + }, + }, + telephone: { + title: '企业管理员手机号', + type: 'string', + maxLength: 11, + format: 'mobile', + ui: { + placeholder: '请输入企业管理员手机号', + }, + }, + }, + required: ['contactsName'], + }; + this.schema1 = { + properties: { + title1: { + title: '', + type: 'string', + ui: { + widget: 'custom', + }, + }, + tips: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + enterpriseQualificationCertificate: { + type: 'string', + title: '营业执照', + ui: { + action: apiConf.fileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: this.envSrv.getEnvironment().appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + this.checkBusinessLicense(args.fileList[0].response.url); + } + }, + } as SFUploadWidgetSchema, + }, + unifiedSocialCreditCode: { + title: '统一社会信用代码', + type: 'string', + minLength: 1, + maxLength: 18, + ui: { + width: 700, + optionalHelp: + '为了企业用户的使用体验,若公司代码即统一社会信用代码已在本应用其他关联平台注册,则此处填写的公司资料将同步更新至对应已注册的平台', + placeholder: '请输入营业执照上的统一社会信用代码', + errors: { + required: '请输入18位公司代码', + }, + }, + }, + enterpriseName: { + title: '公司名称', + type: 'string', + minLength: 2, + maxLength: 100, + ui: { + width: 700, + placeholder: '请输入公司名称', + errors: { + required: '请输入公司名称', + }, + }, + }, + enterpriseType: { + title: '公司类型', + type: 'string', + minLength: 1, + maxLength: 30, + ui: { + width: 700, + placeholder: '请输入公司类型', + errors: { + required: '请输入公司类型', + }, + }, + }, + region: { + type: 'number', + title: '营业执照所在地', + enum: this.regionData, + // default: [110000, 110100, 110105], + ui: { + width: 700, + widget: 'cascader', + valueProperty: 'regionCode', + labelProperty: 'name', + change: (ngModel: string | any[]) => { + const len = ngModel.length - 1; + this.enterpriseAddressCode = ngModel[len]; + // this.getRegionDetailByCode(ngModel[len],'name', 1); // 获取省市区名称 + }, + selectionChange: (values: NzCascaderOption[]) => { + // 获取省市区名称 + const len = values.length - 1; + this.enterpriseAddressCodeStr = values[len].regionFullName.split(',').reverse().join(''); + }, + }, + }, + enterpriseAddress: { + title: '营业执照详细地址', + type: 'string', + minLength: 1, + maxLength: 240, + ui: { + width: 700, + widget: 'textarea', + autosize: { minRows: 2, maxRows: 5 }, + placeholder: '请输入营业执照上的完整详细地址', + errors: { + required: '请输入营业执照上的完整详细地址', + }, + } as SFTextareaWidgetSchema, + }, + + title2: { + title: '', + type: 'string', + ui: { + widget: 'custom', + }, + }, + tipsC: { + title: '法定代表人证件照', + type: 'string', + ui: { + widget: 'custom', + // offsetControl: 6, + }, + }, + tipsA: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + certificatePhotoFront: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.fileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: this.envSrv.getEnvironment().appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + this.checkIdCard(args.fileList[0].response.url, 0, 1); + } + }, + } as SFUploadWidgetSchema, + }, + tipsB: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + certificatePhotoBack: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.fileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: this.envSrv.getEnvironment().appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + this.checkIdCard(args.fileList[0].response.url, 1, 1); + } + }, + } as SFUploadWidgetSchema, + }, + name: { + title: '法人姓名', + type: 'string', + maxLength: 8, + ui: { + width: 700, + placeholder: '请输入营业执照上的法人姓名', + }, + }, + region2: { + type: 'number', + title: '法人证件类型', + enum: this.regionData, + // default: [110000, 110100, 110105], + ui: { + width: 700, + widget: 'cascader', + valueProperty: 'regionCode', + labelProperty: 'name', + change: (ngModel: string | any[]) => { + const len = ngModel.length - 1; + this.enterpriseAddressCode = ngModel[len]; + // this.getRegionDetailByCode(ngModel[len],'name', 1); // 获取省市区名称 + }, + selectionChange: (values: NzCascaderOption[]) => { + // 获取省市区名称 + const len = values.length - 1; + this.enterpriseAddressCodeStr = values[len].regionFullName.split(',').reverse().join(''); + }, + }, + }, + certificateNumber: { + title: '法定代表人身份证号码', + type: 'string', + format: 'id-card', + minLength: 1, + maxLength: 18, + ui: { + width: 700, + placeholder: '请输入法定代表人身份证号码', + }, + }, + validStartTime: { + title: '身份证有效开始日期', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择', + errors: { + required: '请选择开始日期', + }, + change: (i) => { + // this.sf1?.setValue('/dateType1', false); + }, + } as SFDateWidgetSchema, + }, + validEndTime: { + title: '身份证有效截止日期', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择', + errors: { + required: '请选择截止日期', + }, + change: (i) => { + this.sf1?.setValue('/dateType1', false); + }, + } as SFDateWidgetSchema, + }, + dateType1: { + title: '长期', + type: 'boolean', + // enum: [{ label: '长期', value: true }], + ui: { + widget: 'checkbox', + change: (i) => this.longTime(i, 'schema11'), + } as SFCheckboxWidgetSchema, + }, + }, + required: [ + 'enterpriseQualificationCertificate', + 'unifiedSocialCreditCode', + 'enterpriseName', + 'enterpriseType', + 'region', + 'enterpriseAddress', + 'registrationCapital', + 'enterpriseRegistrationTime', + 'operatingEndTime', + 'operatingStartTime', + 'dateType', + 'businessScope', + 'certificatePhotoFront', + 'certificatePhotoBack', + 'name', + 'certificateNumber', + 'validStartTime', + 'validEndTime', + 'dateType1', + ], + }; + + this.ui = { + '*': { + spanLabelFixed: 180, + grid: { span: 24 }, + }, + $title1: { + spanLabelFixed: 0, + }, + $title99: { + spanLabelFixed: 0, + }, + $title2: { + spanLabelFixed: 0, + }, + $title3: { + spanLabelFixed: 0, + }, + $registrationCapital: { + spanLabelFixed: 180, + grid: { span: 11 }, + }, + $unit: { + spanLabelFixed: 100, + grid: { span: 6 }, + }, + }; + } + submitForm() { + + } + // submitForm() { + // // 营业执照基本信息 + // if (!this.sf.value.contactsName) { + // // this.service.msgSrv.warning('请填写申请人姓名'); + // return; + // } + // if (!this.sf1.value.enterpriseQualificationCertificate) { + // // this.service.msgSrv.warning('请上传营业执照'); + // return; + // } + // if (!this.sf1.value.unifiedSocialCreditCode) { + // // this.service.msgSrv.warning('请填写统一社会信用代码'); + // return; + // } + // if (!this.sf1.value.enterpriseName) { + // // this.service.msgSrv.warning('请填写公司名称'); + // return; + // } + // if (!this.sf1.value.enterpriseType) { + // // this.service.msgSrv.warning('请填写公司类型'); + // return; + // } + // if (!this.sf1.value.region) { + // // this.service.msgSrv.warning('请选择所在地区'); + // return; + // } + // if (!this.sf1.value.enterpriseAddress) { + // // this.service.msgSrv.warning('请填写营业执照详细地址'); + // return; + // } + // if (!this.sf1.value.registrationCapital) { + // // this.service.msgSrv.warning('请填写注册资本'); + // return; + // } + // if (!this.sf1.value.enterpriseRegistrationTime) { + // // this.service.msgSrv.warning('请选择成立日期'); + // return; + // } + // if (!this.sf1.value.operatingStartTime) { + // // this.service.msgSrv.warning('请选择营业期限开始日期'); + // return; + // } + // if (this.sf1.value.dateType !== true) { + // if (!this.sf1.value.operatingEndTime) { + // this.service.msgSrv.warning('请选择营业期限结束日期'); + // return; + // } + // if (this.sf1.value.operatingEndTime <= this.sf1.value.operatingStartTime) { + // this.service.msgSrv.warning('营业期限结束日期不能小于或等于开始日期'); + // return; + // } + // } + // if (!this.sf1.value.businessScope) { + // this.service.msgSrv.warning('请填写经营范围'); + // return; + // } + // if (!this.sf1.value.certificatePhotoFront) { + // this.service.msgSrv.warning('请上传身份证正面照'); + // return; + // } + // if (!this.sf1.value.certificatePhotoBack) { + // this.service.msgSrv.warning('请上传身份证反面照'); + // return; + // } + // if (!this.sf1.value.name) { + // this.service.msgSrv.warning('请填写法定代表人'); + // return; + // } + // if (!this.sf1.value.certificateNumber) { + // this.service.msgSrv.warning('请填写法定代表人身份证号'); + // return; + // } + // if (!this.sf1.value.validStartTime) { + // this.service.msgSrv.warning('请选择身份证有效开始日期'); + // return; + // } + // if (this.sf1.value.dateType1 !== true) { + // if (!this.sf1.value.validEndTime) { + // this.service.msgSrv.warning('请选择身份证有效截止日期'); + // return; + // } + // if (this.sf1.value.validEndTime <= this.sf1.value.validStartTime) { + // this.service.msgSrv.warning('身份证有效截止日期不能小于或等于开始日期'); + // return; + // } + // } + // const params: any = { + // contactsName: this.sf.value.contactsName, + // contactsPhone: this.sf.value.telephone, + // certificateNumber: this.sf1.value.certificateNumber, + // unifiedSocialCreditCode: this.sf1.value.unifiedSocialCreditCode, + // enterpriseAddressCodeStr: this.sf1.value.enterpriseAddressCodeStr, + // enterpriseAddressCode: this.sf1.value.region[2], + // enterpriseAddress: this.sf1.value.enterpriseAddress, + // enterpriseName: this.sf1.value.enterpriseName, + // enterpriseNameAbbreviation: this.sf1.value.enterpriseNameAbbreviation, + // enterpriseQualificationCertificate: this.sf1.value.enterpriseQualificationCertificate, + // enterpriseType: this.sf1.value.enterpriseType, + // enterpriseTelephone: this.sf1.value.enterpriseTelephone, + // enterpriseRegistrationTime: this.sf1.value.enterpriseRegistrationTime, + // businessScope: this.sf1.value.businessScope, + // operatingEndTime: this.sf1.value.operatingEndTime, + // operatingStartTime: this.sf1.value.operatingStartTime, + // organizationCode: this.sf1.value.organizationCode, + // registrationCapital: this.sf1.value.registrationCapital, + + // legalPersonIdentity: { + // // ...this.sf1.value, + // validStartTime: this.sf1.value.validStartTime, + // validEndTime: this.sf1.value.validEndTime, + // certificatePhotoBack: this.sf1.value.certificatePhotoBack, + // certificateNumber: this.sf1.value.certificateNumber, + // certificatePhotoFront: this.sf1.value.certificatePhotoFront, + // certificateType: this.sf1.value.certificateType, + // handCertificate: this.sf1.value.handCertificate, + // name: this.sf1.value.name, + // }, + // }; + // if (this.routerinfo.snapshot.queryParams.id) { + // params.id = this.routerinfo.snapshot.queryParams.id; + // } + // delete params?.tips; + // this.service.http.post(this.service.$api_supplierSubmitInfo, params).subscribe((res) => { + // if (res) { + // this.getApplicationInfo(res.data?.id); + // } + // }); + // } + getUserDetail() { + // this.service.http.post(this.service.$api_get_current_user_detail).subscribe((res) => { + // if (res) { + // this.infoData.telephone = res.data.phone; + // this.initSF(); + // } + // }); + } + + viewImg(image: any) { + // this.modal.createStatic(AccountComponentsImgViewComponent, { i: { imgUrl: image } }).subscribe(() => { + // // this.st.reload(); + // }); + } + getRegionToThree() { + // 获取一、二、三级地区详情 + // this.service.http.post(this.service.$api_getRegionToThree).subscribe((res) => { + // this.regionData = res.data; + // this.initSF(); + // }); + } + getApplicationInfo(id: string) { + // 查询申请信息详情 + const params: any = { + id, + }; + // this.service.http.post(this.service.$api_getSupplierEntryDetailInfo, params).subscribe((res) => { + // this.infoData.updateTime = res.data.updateTime; + // this.infoData.auditStatus = res.data.auditStatus; + // this.infoData.auditOpinion = res.data.auditOpinion; + // this.infoData1.contactsName = res.data.contactsName; + // this.infoData1.operationUserPhone = res.data.contactsPhone; + // this.infoData1.enterpriseName = res.data.enterpriseName; + // this.infoData1.unifiedSocialCreditCode = res.data.unifiedSocialCreditCode; + // this.infoData1.enterpriseType = res.data.enterpriseType; + // this.infoData1.registrationCapital = res.data.registrationCapital; + // this.infoData1.enterpriseRegistrationTime = res.data.operatingStartTime; + // this.infoData1.enterpriseRegistrationTime = res.data.operatingStartTime; + // this.infoData1.operatingStartTime = res.data.operatingStartTime; + // this.infoData1.operatingEndTime = res.data.operatingEndTime; + // this.infoData1.operatingEndTime = res.data.operatingEndTime; + // this.enterpriseAddressCodeStr = res.data.enterpriseAddressCodeStr; + // this.infoData1.enterpriseAddress = res.data.enterpriseAddress; + // this.infoData1.enterpriseBusinessAddress = res.data.enterpriseAddress; + // this.infoData1.businessScope = res.data.businessScope; + // this.infoData1.name = res.data.name; + // this.infoData1.certificateNumber = res.data.certificateNumber; + // this.infoData1.validStartTime = res.data.validStartTime; + // this.infoData1.validEndTime = res.data.validEndTime; + // this.infoData1.certificatePhotoFront = res.data.certificatePhotoFront; + // this.infoData1.enterpriseQualificationCertificate = res.data.enterpriseQualificationCertificate; + // this.infoData1.certificatePhotoBackurl = res.data.certificatePhotoBack; + // this.infoData1.certificatePhotoFronturl = res.data.certificatePhotoFront; + // this.infoData1.enterpriseQualificationCertificateurl = res.data.enterpriseQualificationCertificate; + + // this.infoData1.certificatePhotoBack = res.data.certificatePhotoBack; + // this.signingPeriod = res.data.signingPeriod; + // if (res.data) { + // // 申请人信息 + // this.infoData.certificatePhotoBack = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoBack, + // response: { + // url: res.data.certificatePhotoBack, + // }, + // }, + // ]; + // this.infoData.certificatePhotoFront = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoFront, + // response: { + // url: res.data.certificatePhotoFront, + // }, + // }, + // ]; + // if (!res.data.validEndTime) { + // this.infoData1.dateType1 = true; + // // this.sf.getProperty('/validStartTime').schema.readOnly = true; + // // this.sf.getProperty('/validEndTime').schema.readOnly = true; + // } + // } + // if (res.data) { + // // 营业执照基本信息 + // this.infoData1.enterpriseQualificationCertificate = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.enterpriseQualificationCertificate, + // response: { + // url: res.data.enterpriseQualificationCertificate, + // }, + // }, + // ]; + // this.infoData1.certificatePhotoFront = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoFront, + // response: { + // url: res.data.certificatePhotoFront, + // }, + // }, + // ]; + // this.infoData1.certificatePhotoBack = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoBack, + // response: { + // url: res.data.certificatePhotoBack, + // }, + // }, + // ]; + // this.infoData1.unifiedSocialCreditCode = res.data.unifiedSocialCreditCode; + // this.infoData1.enterpriseName = res.data.enterpriseName; + // this.infoData1.enterpriseType = res.data.enterpriseType; + // this.infoData1.enterpriseAddress = res.data.enterpriseAddress; + // // this.infoData1.enterpriseAddressCodeStr = res.data.businessLicenseJson.enterpriseAddressCodeStr; + // // this.infoData1.enterpriseBusinessAddressCodeStr = res.data.businessLicenseJson.enterpriseBusinessAddressCodeStr; + // this.infoData1.registrationCapital = res.data.registrationCapital; + // this.infoData1.enterpriseRegistrationTime = res.data.enterpriseRegistrationTime; + // this.infoData1.operatingStartTime = res.data.operatingStartTime; + // this.infoData1.operatingEndTime = res.data.operatingEndTime; + // this.infoData1.businessScope = res.data.businessScope; + // this.enterpriseAddressCodeStr = res.data.enterpriseAddressCodeStr; + // this.enterpriseAddressCode = +res.data.enterpriseAddressCode; + // this.getRegionDetailByCode(res.data.enterpriseAddressCode); + + // this.enterpriseBusinessAddressCodeStr = res.data.enterpriseBusinessAddressCodeStr; + // this.enterpriseBusinessAddressCode = res.data.enterpriseBusinessAddressCode; + // if (!res.data.operatingEndTime) { + // this.infoData1.dateType = true; + // } + // this.infoData.contactsName = res.data.contactsName; + // this.infoData.telephone = res.data.contactsPhone; + // } + + // if (res.data.auditStatus === 0 || res.data.auditStatus === 2 || res.data.auditStatus === 3) { + // // 1:待审核,2:复审,3:终审,5:已驳回 + // } else if (res.data.auditStatus === 1) { + // // 4:待签约 + // // this.getPdf(); + // // this.getEnterpriseInfo(this.id); + // } else if (res.data.auditStatus === 4) { + // // 6:已终止,7:已成功 + // this.step = 3; + // } + // this.initSF(); + // }); + } + getApplicationInfo2(id: string) { + // 查询申请信息详情 + const params: any = { + id, + }; + // this.service.http.post(this.service.$api_getSupplierEntryDetailInfo, params).subscribe((res) => { + // this.infoData.updateTime = res.data.updateTime; + // this.infoData.auditStatus = res.data.auditStatus; + // this.infoData.auditOpinion = res.data.auditOpinion; + // this.infoData1.contactsName = res.data.contactsName; + // this.infoData1.enterpriseName = res.data.enterpriseName; + // this.infoData1.unifiedSocialCreditCode = res.data.unifiedSocialCreditCode; + // this.infoData1.enterpriseType = res.data.enterpriseType; + // this.infoData1.registrationCapital = res.data.registrationCapital; + // this.infoData1.enterpriseRegistrationTime = res.data.operatingStartTime; + // this.infoData1.enterpriseRegistrationTime = res.data.operatingStartTime; + // this.infoData1.operatingStartTime = res.data.operatingStartTime; + // this.infoData1.operatingEndTime = res.data.operatingEndTime; + // this.infoData1.operatingEndTime = res.data.operatingEndTime; + // this.enterpriseAddressCodeStr = res.data.enterpriseAddressCodeStr; + // this.infoData1.enterpriseAddress = res.data.enterpriseAddress; + // this.infoData1.enterpriseBusinessAddress = res.data.enterpriseAddress; + // this.infoData1.businessScope = res.data.businessScope; + // this.infoData1.name = res.data.name; + // this.infoData1.certificateNumber = res.data.certificateNumber; + // this.infoData1.validStartTime = res.data.validStartTime; + // this.infoData1.validEndTime = res.data.validEndTime; + // this.infoData1.certificatePhotoFront = res.data.certificatePhotoFront; + // this.infoData1.enterpriseQualificationCertificate = res.data.enterpriseQualificationCertificate; + // this.infoData1.certificatePhotoBackurl = res.data.certificatePhotoBack; + // this.infoData1.certificatePhotoFronturl = res.data.certificatePhotoFront; + // this.infoData1.enterpriseQualificationCertificateurl = res.data.enterpriseQualificationCertificate; + + // this.infoData1.certificatePhotoBack = res.data.certificatePhotoBack; + // this.signingPeriod = res.data.signingPeriod; + // if (res.data) { + // // 申请人信息 + // this.infoData.certificatePhotoBack = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoBack, + // response: { + // url: res.data.certificatePhotoBack, + // }, + // }, + // ]; + // this.infoData.certificatePhotoFront = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoFront, + // response: { + // url: res.data.certificatePhotoFront, + // }, + // }, + // ]; + // if (!res.data.validEndTime) { + // this.infoData1.dateType = true; + // // this.sf.getProperty('/validStartTime').schema.readOnly = true; + // // this.sf.getProperty('/validEndTime').schema.readOnly = true; + // } + // } + // if (res.data) { + // // 营业执照基本信息 + // this.infoData1.enterpriseQualificationCertificate = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.enterpriseQualificationCertificate, + // response: { + // url: res.data.enterpriseQualificationCertificate, + // }, + // }, + // ]; + // this.infoData1.certificatePhotoFront = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoFront, + // response: { + // url: res.data.certificatePhotoFront, + // }, + // }, + // ]; + // this.infoData1.certificatePhotoBack = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoBack, + // response: { + // url: res.data.certificatePhotoBack, + // }, + // }, + // ]; + // this.infoData1.unifiedSocialCreditCode = res.data.unifiedSocialCreditCode; + // this.infoData1.enterpriseName = res.data.enterpriseName; + // this.infoData1.enterpriseType = res.data.enterpriseType; + // this.infoData1.enterpriseAddress = res.data.enterpriseAddress; + // // this.infoData1.enterpriseAddressCodeStr = res.data.businessLicenseJson.enterpriseAddressCodeStr; + // // this.infoData1.enterpriseBusinessAddressCodeStr = res.data.businessLicenseJson.enterpriseBusinessAddressCodeStr; + // this.infoData1.registrationCapital = res.data.registrationCapital; + // this.infoData1.enterpriseRegistrationTime = res.data.enterpriseRegistrationTime; + // this.infoData1.operatingStartTime = res.data.operatingStartTime; + // this.infoData1.operatingEndTime = res.data.operatingEndTime; + // this.infoData1.businessScope = res.data.businessScope; + // this.enterpriseAddressCodeStr = res.data.enterpriseAddressCodeStr; + // this.enterpriseAddressCode = +res.data.enterpriseAddressCode; + // this.getRegionDetailByCode(res.data.enterpriseAddressCode); + + // this.enterpriseBusinessAddressCodeStr = res.data.enterpriseBusinessAddressCodeStr; + // this.enterpriseBusinessAddressCode = res.data.enterpriseBusinessAddressCode; + // if (!res.data.operatingEndTime) { + // this.infoData1.dateType1 = true; + // } + // this.infoData.contactsName = res.data.contactsName; + // this.infoData.telephone = res.data.contactsPhone; + // this.infoData1.operationUserPhone = res.data.contactsPhone; + // } + // this.initSF(); + // }); + } + reloadApply() { + // 重新申请入驻 + this.modalService.confirm({ + nzTitle: '确定要重新申请入驻吗?', + nzContent: '当前申请已填写的资料将清空,重新申请需要重新填写资料', + nzOnOk: () => + new Promise((resolve, reject) => { + this.sf.reset(); + resolve(1); + }).catch(() => console.log('Oops errors!')), + }); + } + + updateBranchList(bankId: any, regionCode: any) { + // return this.service + // .loadBranchBankList(bankId, regionCode) + // .pipe( + // map((data) => { + // return data.map((m) => { + // return { label: m.branchName, value: m.branchCode }; + // }); + // }), + // ) + // .subscribe((res) => { + // // this.sf2.getProperty('/bankBranchName')!.schema.enum = res; + // // this.sf2.getProperty('/bankBranchName')!.widget.reset(res || res[0]); + // this.branchBanks = res || []; + // // this.initSF(); + // }); + } + loadBranchBanks(bankId: any, regionCode: any) { + // this.service + // .loadBranchBankList(bankId, regionCode) + // .pipe( + // map((data) => { + // return data.map((m) => { + // return { label: m.branchName, value: m.branchCode }; + // }); + // }), + // ) + // .subscribe((res: any[]) => { + // this.branchBanks = res || []; + // this.getUserDetail(); + this.loadBrandDist(); + this.updateBranchList(bankId, regionCode); + // }); + } + loadBrandDist() { + // this.service.http.post(this.service.$api_get_all_region).subscribe((res) => { + // const data = res.data; + // data.forEach((item: { children: any[] }) => { + // item.children.forEach((element: { isLeaf: boolean }) => { + // element.isLeaf = true; + // }); + // }); + // // this.sf2.getProperty('/bankAreaArr').schema.enum = data; + // // this.sf2.getProperty('/bankAreaArr').widget.reset(data); + // this.bankRegion = data; + // this.initSF(); + // }); + } + + getProvinceData() { + // return this.service.http.post(this.service.$api_getRegionByCode, { regionCode: '' }).pipe( + // map((res) => { + // return res.data.map((m: { name: any; regionCode: any }) => { + // return { label: m.name, value: m.regionCode }; + // }); + // }), + // ); + } + updateArea(parentId: string, target: string, type: number, nextTarget: string, sfObj: SFComponent): any { + // 改变二级数据时,同时清空三级数据 + if (type === 2 && sfObj) { + sfObj.getProperty(nextTarget)!.schema.enum = []; + sfObj.getProperty(nextTarget)!.widget.reset([]); + sfObj.getProperty(nextTarget)!.setValue(null, true); + } + + if (!parentId && sfObj) { + sfObj.getProperty(target)!.schema.enum = []; + sfObj.getProperty(target)!.widget.reset([]); + sfObj.getProperty(target)!.setValue(null, true); + } else { + // return this.service.http + // .get(this.service.$api_getRegionByCode, { regionCode: parentId }) + // .pipe( + // map((res) => { + // return res.data.map((m: { regionFullName: string; name: any; regionCode: any }) => { + // const fullName = m.regionFullName.split(',').reverse().join(''); + // return { label: m.name, value: m.regionCode, fullName }; + // }); + // }), + // ) + // .subscribe((res) => { + // sfObj.getProperty(target)!.schema.enum = res; + // sfObj.getProperty(target)!.widget.reset(res); + // }); + } + } + getCategoryList() { + // return this.service.http.post(this.service.$api_getCategoryList, { id: '' }).pipe( + // map((data) => { + // return data.data.map((m: { name: any; id: any }) => { + // return { label: m.name, value: m.id }; + // }); + // }), + // ); + // .subscribe((res) => { + // this.sf3.getProperty('/classify').schema.enum = res; + // this.sf3.getProperty('/classify').widget.reset(res || res[0]); + // }); + } + getEnterpriseInfo(id: any) { + // 查询企业信息详情 + const params: any = { + id, + }; + // this.service.http.post(this.service.$api_getEnterpriseInfo, params).subscribe((res) => { + // this.signingPeriod = res.data.signingPeriod; + // }); + } + + + + auditSupplier(contractNo: any) { + // 审核供应商,签署成功需要调此接口 + const params = { + auditStatus: 7, + id: this.id, + contractNum: contractNo, + }; + // this.service.request(this.service.$api_auditSupplier, params).subscribe((res) => { + // this.service.msgSrv.success('签署成功!'); + // this.step = 3; + // this.infoData.auditStatus = 7; + // }); + } + cancel(): void { + this.msg.info('已取消'); + } + /* + * 根据地区code查询地区详情 + * code:请求参数 + * type:参数 name:获取省市区名称,fullcode:获取省市区code + * num:参数 1:第一个地区选择,2:第二个地区选择 + */ + getRegionDetailByCode(code: any) { + // 根据地区code查询地区详情 + // this.service.http.post(this.service.$api_getRegionDetailByCode, { regionCode: code }).subscribe((res) => { + // // 供选择地区保存-获取省市区名称 + // // 第二个地区选择 + + // const a = res.data.regionFullCodes.split(','); + + // this.sf1?.setValue('/region', [+a[0], +a[1], +a[2]]); + // this.enterpriseBusinessAddressCodeStr = res.data.regionFullName.replace(/,/g, ''); + // }); + } + longTime(i: boolean | SFSchemaEnum[], type: string) { + if (type === 'schema') { + if (i) { + // this.sf?.setValue('/validStartTime', Date); + this.sf?.setValue('/validEndTime', Date); + // this.sf.getProperty('/validStartTime').schema.readOnly = true; + this.sf.getProperty('/validEndTime')!.schema.readOnly = true; + } else { + // this.sf.getProperty('/validStartTime').schema.readOnly = false; + this.sf.getProperty('/validEndTime')!.schema.readOnly = false; + } + } + if (type === 'schema1') { + if (i) { + // this.sf1?.setValue('/operatingStartTime', Date); + this.sf1?.setValue('/operatingEndTime', Date); + // this.sf1.getProperty('/operatingStartTime').schema.readOnly = true; + this.sf1.getProperty('/operatingEndTime')!.schema.readOnly = true; + } else { + // this.sf1.getProperty('/operatingStartTime').schema.readOnly = false; + this.sf1.getProperty('/operatingEndTime')!.schema.readOnly = false; + } + } + if (type === 'schema11') { + if (i) { + // this.sf1?.setValue('/validStartTime', Date); + this.sf1?.setValue('/validEndTime', Date); + // this.sf1.getProperty('/validStartTime').schema.readOnly = true; + this.sf1.getProperty('/validEndTime')!.schema.readOnly = true; + } else { + // this.sf1.getProperty('/validStartTime').schema.readOnly = false; + this.sf1.getProperty('/validEndTime')!.schema.readOnly = false; + } + } + } + prev() { + // 返回上一步 + if (this.subStep > 0) { + this.subStep--; + } + if (this.subStep === 2) { + if (this.id) { + this.loadBranchBanks(this.infoData2.bankCode, this.infoData2.bankAddressCode); + } else { + this.loadBrandDist(); + } + } + } + clearData() { + // 重新申请 + const params: any = { + id: this.id, + }; + // this.service.request(this.service.$api_deleteApplyCache, params).subscribe((res) => { + // if (res) { + // this.service.msgSrv.success('已清除申请资料,请重新申请!'); + // this.edit(); + // this.id = ''; + // this.infoData = {}; + // this.infoData1 = {}; + // this.infoData2 = { + // accountName: '', + // }; + // this.infoData3 = {}; + // } + // }); + } + edit() { + this.subStep = 0; + this.getApplicationInfo2(this.routerinfo.snapshot.queryParams.id); + } + goPage(page: string) { + if (page === 'list') { + this.router.navigate(['./account/role']); + } else { + this.router.navigate(['./account/apply-list']); + } + } + goBack() { + window.history.go(-1); + } + onChange(result: Date): void {} + refreshPage() { + window.location.reload(); + } + checkIdCard(imgurl: any, isFront: number, type: number) { + // 识别身份证 参数isFront:0-正面、1-背面;type:0-申请人身份证,1-法定代表人身份证 + const params = { + idCardImagePath: imgurl, + isFront, + }; + // this.service.request(this.service.$api_checkIdCard, params).subscribe((res) => { + // if (res) { + // if (type === 0) { + // // 申请人身份证 + // if (isFront === 0) { + // // 正面 + // if (res.name) { + // this.sf.setValue('/name', res.name); + // } + // if (res.idCardNumber) { + // this.sf.setValue('/certificateNumber', res.idCardNumber); + // } + // } + // if (isFront === 1) { + // // 背面 + // if (res.validFrom) { + // this.sf.setValue('/validStartTime', res.validFrom); + // } + // if (res.validTo) { + // this.sf.setValue('/validEndTime', res.validTo); + // } + // } + // } + // if (type === 1) { + // // 法定代表人身份证 + // if (isFront === 0) { + // // 正面 + // if (res.name) { + // this.sf1.setValue('/name', res.name); + // } + // if (res.idCardNumber) { + // this.sf1.setValue('/certificateNumber', res.idCardNumber); + // } + // } + // if (isFront === 1) { + // // 背面 + // if (res.validFrom) { + // this.sf1.setValue('/validStartTime', res.validFrom); + // } + // if (res.validTo) { + // this.sf1.setValue('/validEndTime', res.validTo); + // } + // } + // } + // } + // }); + } + checkBusinessLicense(imgurl: any) { + // 识别营业执照 + const params = { + licenseImagePath: imgurl, + }; + // this.service.request(this.service.$api_checkBusinessLicense, params).subscribe((res) => { + // if (res) { + // if (res.unifiedSocialCreditCode) { + // this.sf1.setValue('/unifiedSocialCreditCode', res.unifiedSocialCreditCode); + // } + // if (res.enterpriseName) { + // this.sf1.setValue('/enterpriseName', res.enterpriseName); + // } + // if (res.enterpriseType) { + // this.sf1.setValue('/enterpriseType', res.enterpriseType); + // } + // if (res.addressRegionCodes) { + // this.sf1.setValue('/region', res.addressRegionCodes); + // } + // if (res.address) { + // this.sf1.setValue('/enterpriseAddress', res.address); + // } + // if (res.foundDate) { + // this.sf1.setValue('/enterpriseRegistrationTime', res.foundDate); + // } + // if (res.registeredCapital) { + // this.sf1.setValue('/registrationCapital', res.registeredCapital); + // } + // if (res.businessTermStartDate) { + // this.sf1.setValue('/operatingStartTime', res.businessTermStartDate); + // } + // if (res.businessTermEndDate) { + // this.sf1.setValue('/operatingEndTime', res.businessTermEndDate); + // } + // if (res.businessScope) { + // this.sf1.setValue('/businessScope', res.businessScope); + // } + // const len = res.addressRegionCodes.length - 1; + // this.enterpriseAddressCode = res.addressRegionCodes[len]; + // this.enterpriseAddressCodeStr = res.addressRegionNames; + // if (!res.businessTermEndDate) { + // this.sf1.setValue('/dateType', true); + // } + // } + // }); + } + + // resetForm(): void { + // this.infoData.reset(); + // } +} diff --git a/src/app/routes/usercenter/components/freight/list/view/view.component.html b/src/app/routes/usercenter/components/freight/list/view/view.component.html new file mode 100644 index 00000000..96d0bc91 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/view/view.component.html @@ -0,0 +1,49 @@ + + + + + + + + + + + + +

道路运输经营许可证

+ +
+ + +
+
+
+ + diff --git a/src/app/routes/usercenter/components/freight/list/view/view.component.less b/src/app/routes/usercenter/components/freight/list/view/view.component.less new file mode 100644 index 00000000..48f605d9 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/view/view.component.less @@ -0,0 +1,46 @@ +@import '~@delon/theme/index'; +:host { + ::ng-deep { + .ant-steps-dot { + .ant-steps-item-content { + width: 200px; + } + .ant-steps-item-icon { + margin-left: 96px; + } + .ant-steps-item-tail::after { + margin-left: 40px; + } + } + .success { + color: @success-color; + } + + .warning { + color: @warning-color; + } + + .error { + color: @error-color; + } + } + .mt16 { + margin-top: 16px; + } + .user-info { + display: flex; + font-size: 16px; + .enterprise-name { + margin-right: 15px; + } + img { + width: 64px; + height: 64px; + margin-right: 15px; + border-radius: 50%; + } + .user-info-des { + margin-bottom: 5px; + } + } +} diff --git a/src/app/routes/usercenter/components/freight/list/view/view.component.spec.ts b/src/app/routes/usercenter/components/freight/list/view/view.component.spec.ts new file mode 100644 index 00000000..6e2a7782 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/view/view.component.spec.ts @@ -0,0 +1,23 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { FreightComponentsListViewComponent } from './view.component'; + +describe('FreightComponentsListViewComponent', () => { + let component: FreightComponentsListViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FreightComponentsListViewComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FreightComponentsListViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/usercenter/components/freight/list/view/view.component.ts b/src/app/routes/usercenter/components/freight/list/view/view.component.ts new file mode 100644 index 00000000..f72bb40a --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/view/view.component.ts @@ -0,0 +1,257 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { UsermanageService } from '../../../../services/usercenter.service'; +import { SFComponent, SFSchema, SFDateWidgetSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form'; +import { Observable, Observer } from 'rxjs'; +@Component({ + selector: 'app-Freight-components-list-view', + templateUrl: './view.component.html', + styleUrls: ['./view.component.less'], +}) +export class FreightComponentsListViewComponent implements OnInit { + i: any; + url = `/rule?_allow_anonymous=true`; + + @ViewChild('st', { static: false }) st!: STComponent; + detailData: any = { + status: 0 + }; + isShow = false; + isVisible = false; + modalTitle = '有效期'; + modalName = ''; + ui!: SFUISchema; + schema!: SFSchema; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sf1', { static: false }) sf1!: SFComponent; + validData: any = ['FreightsType']; + FreightsData: any = {}; + + constructor( + private http: _HttpClient, + private modal: ModalHelper, + public service: UsermanageService, + private route: ActivatedRoute, + private modalHelper: ModalHelper, + private msgSrv: NzMessageService, + ) {} + + ngOnInit() { + console.log(this.route.snapshot); + this.initData(); + this.initSF(); + // this.launchSign(); + } + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + name: { + title: '许可证号', + type: 'string', + maxLength: 20, + ui: { + placeholder: '请输入角色名称', + }, + }, + phone: { + title: '业户名称', + type: 'string', + maxLength: 20, + ui: { + placeholder: '请输入业户名称', + }, + }, + roleDescription: { + title: '地址', + type: 'string', + maxLength: 30, + ui: { + placeholder: '请输入地址', + widget: 'textarea', + }, + }, + effectiveDate: { + title: '发证日期', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd 00:00:00', + // hidden: this.modalName === 'effectiveDate' ? false : true, + } as SFDateWidgetSchema, + }, + phone3: { + title: '有效期', + type: 'string', + ui: { + placeholder: '请输入业户名称', + }, + }, + phone4: { + title: '有效期截止', + type: 'string', + ui: { + placeholder: '请输入业户名称', + }, + }, + phone5: { + title: '经营范围', + type: 'string', + ui: { + placeholder: '请输入业户名称', + }, + }, + avatar: { + type: 'string', + title: '证照', + ui: { + // action: environment.UPLOAD_URL, + fileType: 'image/png,image/jpeg,image/jpg,image/png,image/gif,image/bmp', + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: environment.appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + const avatar = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: args.fileList[0].response.url, + response: { + url: args.fileList[0].response.url, + }, + }, + ]; + this.sf?.setValue('/avatar', avatar); + } + }, + beforeUpload: (file: any, _fileList) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 5; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + }, + } as SFUploadWidgetSchema, + }, + }, + required: ['name', 'phone'], + }; + this.ui = { '*': { spanLabelFixed: 200, grid: {offset:4, span: 12 } } }; + } + showModal(name: any) { + this.modalName = name; + if (name === 'effectiveDate') { + this.isShow = true; + } else { + this.isVisible = true; + } + } + async initData() { + console.log(this.route.snapshot, 'this.route.snapshot'); + + const params = { + tenantId: this.route.snapshot.params.id, + }; + } + + /** + * 根据地区code查询地区详情 + * @param code 地区代码 + */ + async getRegionFullName(code: any) { + const params = { + regionCode: code, + }; + const res = await this.service.asyncRequest(this.service.$api_get_region_detailByCode, params, 'POST', true); + // if (res && res.regionFullName) { + // const arr = res.regionFullName.split(','); + // res.regionFullName = arr.reverse().join('-'); + // } + return res && res.regionFullName; + } + add() { + // this.modal + // .createStatic(FormEditComponent, { i: { id: 0 } }) + // .subscribe(() => this.st.reload()); + } + goBack() { + window.history.go(-1); + } + /** + * 冻结 + */ + freezeOrResume(type: number) { + this.service.http + .post(this.service.$api_set_freezeOrResume, { + tenantId: this.route.snapshot.params.id, + // tenantId: this.route.snapshot.queryParams.tenantId, + status: type, + }) + .subscribe((res) => { + if (res.data === true) { + if (type === 0) { + this.service.msgSrv.success(`启用成功!`); + } else if (type === 1) { + this.service.msgSrv.success(`冻结成功!`); + } + this.ngOnInit(); + } else { + this.service.msgSrv.error(res.msg || '操作失败!'); + } + }); + } + + handleCancel(name: any) { + if (name === 'effectiveDate') { + this.isShow = false; + } else { + this.isVisible = false; + } + } + handleOK(name: any) { + const params: any = { + tenantId: this.route.snapshot.params.id, + // tenantId: this.route.snapshot.queryParams.tenantId, + }; + + if (name === 'effectiveDate') { + params.effectiveDate = this.sf?.value?.effectiveDate; + } else { + Object.assign(params, this.sf1?.value); + } + this.service.http.post(this.service.$api_set_freezeOrResume, params).subscribe((res) => { + if (res.data === true) { + this.service.msgSrv.success(`编辑成功!`); + this.ngOnInit(); + } else { + this.service.msgSrv.error(res.msg || '编辑失败!'); + } + if (name === 'effectiveDate') { + this.isShow = false; + } else { + this.isVisible = false; + } + }); + } +} diff --git a/src/app/routes/usercenter/services/usercenter.service.ts b/src/app/routes/usercenter/services/usercenter.service.ts new file mode 100644 index 00000000..f73600a1 --- /dev/null +++ b/src/app/routes/usercenter/services/usercenter.service.ts @@ -0,0 +1,91 @@ +/* + * @Author: your name + * @Date: 2021-11-29 15:22:34 + * @LastEditTime: 2021-11-29 15:43:42 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\usercenter\services\usercenter.service.ts + */ +import { Injectable, Injector } from '@angular/core'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { BaseService } from 'src/app/shared/services/core/base.service'; +import { EAFileUtil } from 'src/app/shared/utils/file.util'; + +@Injectable({ + providedIn: 'root', +}) +export class UsermanageService extends BaseService { + public $api_add_one!: string; + public $api_add_many!: string; + public $api_edit_one!: string; + public $api_edit_many!: string; + public $api_del_one!: string; + public $api_del_many!: string; + public $api_get_many!: string; + public $api_get_one!: string; + public $api_get_page!: string; + public $api_export!: string; + public $api_import!: string; + public $api_import_download_tpl!: string; + // 平台用户列表 + $api_get_page_user = '/cuc/userApp/getOperatorUserList?_allow_anonymous=true'; + // 获取供应商采购商应用 + $api_get_supplier_purchaserApp = '/cuc/appInfo/getSupplierPurchaserApp?_allow_anonymous=true'; + + // 供应商列表 + $api_get_supplier_page = '/cuc/operator/list/listSupplierPage?_allow_anonymous=true'; + // 供应商详情 + $api_get_supplier_info = '/cuc/operator/selectSupplierDetailInfo?_allow_anonymous=true'; + // 用户冻结或恢复应用用户 + $api_set_freezeOrResume = '/cuc/operator/updateSupplierInfo?_allow_anonymous=true'; + // 获取一、二、三级地区详情 + $api_getRegionToThree = '/cms/region/getRegionToThree?_allow_anonymous=true'; + // 根据地区code查询列表 + $api_getRegionByCode = '/cms/region/getRegionByCode?_allow_anonymous=true'; + + // 根据地区code查询地区详情 + $api_get_region_detailByCode = '/cms/region/getRegionDetailByCode?_allow_anonymous=true'; + // 查询供应商申请列表分页 + $api_get_supplier_audit_page = `/cuc/operator/audit/listSupplierPage?_allow_anonymous=true`; + // 查询供应商入驻详情 + $api_get_supplier_entryInfo = `/cuc/operator/selectSupplierEntryDetailInfo?_allow_anonymous=true`; + // 审核供应商 + $api_auditSupplier = `/cuc/operator/auditSupplier?_allow_anonymous=true`; + // 查询采购商列表分页 + $api_get_purchaserList = `/cuc/operator/list/queryPurchaserPage`; + // 查询采购商申请列表分页 + $api_get_purchaserAudit = `/cuc/operator/audit/queryPurchaserPage`; + // 查询采购商认证详情 + $api_get_purchaser_detailInfo = `/cuc/operator/selectPurchaserDetailInfo`; + + // 查询采购商审核总数 + $api_query_purchaser_count = `/cuc/operator/queryPurchaserCount`; + // 获取供应商审核总数 + $api_query_supplier_count = `/cuc/operator/querySupplierCount`; + + // 审核企业详情 + $api_get_cache_enterprise_info = ''; + // 获取审核进度 + $api_get_progress = '/cuc/reviewRecordInfo/getReviewProgress'; + // 查询流程信息列表 + $api_get_progressInfoList = '/cuc/processInfo/getProcessInfoList'; + // 审核通过 + $api_set_audit_pass = '/cuc/reviewRecordInfo/reviewPassed'; + // 审核拒绝 + $api_set_audit_reject = '/cuc/reviewRecordInfo/reviewRejected'; + + // 发起签约 //撤回签约 + $api_get_startSigning = `/cuc/operator/startSigning?_allow_badcode=true`; + + // 发起续约 //撤回续约 + $api_get_startRenewalContract = `/cuc/operator/startRenewalContract?_allow_badcode=true`; + // 获取审核记录 + $api_get_reviewRecordInfoList = '/cuc/reviewRecordInfo/getReviewRecordInfoList'; + // 查看合同详情 + $api_get_contract_detail = `/scce/etc/etc/contractDetail/getContractByContractNo`; + + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/usercenter/usercenter-routing.module.ts b/src/app/routes/usercenter/usercenter-routing.module.ts new file mode 100644 index 00000000..c72ff65c --- /dev/null +++ b/src/app/routes/usercenter/usercenter-routing.module.ts @@ -0,0 +1,29 @@ +/* + * @Author: your name + * @Date: 2021-11-29 15:22:34 + * @LastEditTime: 2021-11-29 17:28:57 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\usercenter\usercenter-routing.module.ts + */ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { FreightComponentsListComponent } from './components/freight/list/list.component'; +import { FreightComponentsListNewComponent } from './components/freight/list/new/new.component'; +import { FreightComponentsListViewComponent } from './components/freight/list/view/view.component'; + + +const routes: Routes = [ + + { path: 'freight/list', component: FreightComponentsListComponent }, + { path: 'freight/list/view/:id', component: FreightComponentsListViewComponent }, + { path: 'freight/list/new', component: FreightComponentsListNewComponent }, + +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class UsercenterRoutingModule {} diff --git a/src/app/routes/usercenter/usercenter.module.ts b/src/app/routes/usercenter/usercenter.module.ts new file mode 100644 index 00000000..6a731274 --- /dev/null +++ b/src/app/routes/usercenter/usercenter.module.ts @@ -0,0 +1,26 @@ +/* + * @Author: your name + * @Date: 2021-11-29 15:22:34 + * @LastEditTime: 2021-11-29 17:29:44 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\usercenter\usercenter.module.ts + */ +import { NgModule } from '@angular/core'; +import { SharedModule } from '@shared'; +import { FreightComponentsListComponent } from './components/freight/list/list.component'; +import { FreightComponentsListNewComponent } from './components/freight/list/new/new.component'; +import { FreightComponentsListViewComponent } from './components/freight/list/view/view.component'; +import { UsercenterRoutingModule } from './usercenter-routing.module'; + +const COMPONENTS = [ + FreightComponentsListComponent, + FreightComponentsListViewComponent, + FreightComponentsListNewComponent +]; + +@NgModule({ + imports: [SharedModule, UsercenterRoutingModule], + declarations: [...COMPONENTS], +}) +export class UsercenterModule {} diff --git a/src/app/shared/shared-zorro.module.ts b/src/app/shared/shared-zorro.module.ts index 8bbf3e97..2e174902 100644 --- a/src/app/shared/shared-zorro.module.ts +++ b/src/app/shared/shared-zorro.module.ts @@ -1,7 +1,11 @@ +import { NzProgressModule } from 'ng-zorro-antd/progress'; +import { NzPopoverModule } from 'ng-zorro-antd/popover'; +import { NzModalModule } from 'ng-zorro-antd/modal'; +import { NzToolTipModule } from 'ng-zorro-antd/tooltip'; /* * @Author: your name * @Date: 2021-11-29 10:20:33 - * @LastEditTime: 2021-11-29 14:59:56 + * @LastEditTime: 2021-11-29 17:25:49 * @LastEditors: Please set LastEditors * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: \tms-obc-web\src\app\shared\shared-zorro.module.ts @@ -22,7 +26,10 @@ import { NzSelectModule } from 'ng-zorro-antd/select'; import { NzSpinModule } from 'ng-zorro-antd/spin'; import { NzTableModule } from 'ng-zorro-antd/table'; import { NzListModule } from 'ng-zorro-antd/list'; - +import { NzTagModule } from 'ng-zorro-antd/tag'; +import { NzPopconfirmModule } from 'ng-zorro-antd/popconfirm'; +import { NzRateModule } from 'ng-zorro-antd/rate'; +import { NzResultModule } from 'ng-zorro-antd/result'; export const SHARED_ZORRO_MODULES = [ NzButtonModule, NzGridModule, @@ -40,4 +47,10 @@ export const SHARED_ZORRO_MODULES = [ NzDividerModule, NzStepsModule, NzListModule, + NzTagModule, + NzToolTipModule, + NzModalModule, + NzPopconfirmModule, + NzRateModule, + NzResultModule ]; diff --git a/src/assets/mocks/menu-data.json b/src/assets/mocks/menu-data.json index 7037444d..e523be3f 100644 --- a/src/assets/mocks/menu-data.json +++ b/src/assets/mocks/menu-data.json @@ -25,6 +25,42 @@ "link": "/demo/alain" } ] + }, + { + "text": "用户中心", + "icon": "anticon anticon-dashboard", + "group": true, + "children": [ + { + "text": "货主管理", + "icon": "anticon anticon-dashboard", + "link": "/demo/zorro", + "children": [ + { + "text": "货主列表", + "icon": "anticon anticon-dashboard", + "link": "/usercenter/freight/list" + }, + { + "text": "货主详情", + "hide": true, + "icon": "anticon anticon-dashboard", + "link": "/usercenter/freight/list/view/:id" + }, + { + "text": "企业认证", + "hide": true, + "icon": "anticon anticon-dashboard", + "link": "/usercenter/freight/new" + }, + { + "text": "企业审核", + "icon": "anticon anticon-dashboard", + "link": "/usercenter/freight/list/view/:id" + } + ] + } + ] } ] } diff --git a/src/style-icons-auto.ts b/src/style-icons-auto.ts index 1fda870f..8ccf0978 100644 --- a/src/style-icons-auto.ts +++ b/src/style-icons-auto.ts @@ -51,7 +51,7 @@ import { TrophyOutline, UsbOutline, UserOutline, - WeiboCircleOutline + WeiboCircleOutline,QuestionCircleFill } from '@ant-design/icons-angular/icons'; export const ICONS_AUTO = [ @@ -102,5 +102,6 @@ export const ICONS_AUTO = [ TrophyOutline, UsbOutline, UserOutline, - WeiboCircleOutline + WeiboCircleOutline, + QuestionCircleFill ]; From d18633a1a80cb928dfbe5d773a271943056976fc Mon Sep 17 00:00:00 2001 From: Taric Xin Date: Mon, 29 Nov 2021 20:07:51 +0800 Subject: [PATCH 0004/1600] edit --- .../sys-setting/sys-setting-routing.module.ts | 10 ++++ .../routes/sys-setting/sys-setting.module.ts | 9 +++ src/assets/mocks/menu-data.json | 55 +++++++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 src/app/routes/sys-setting/sys-setting-routing.module.ts create mode 100644 src/app/routes/sys-setting/sys-setting.module.ts diff --git a/src/app/routes/sys-setting/sys-setting-routing.module.ts b/src/app/routes/sys-setting/sys-setting-routing.module.ts new file mode 100644 index 00000000..5c565818 --- /dev/null +++ b/src/app/routes/sys-setting/sys-setting-routing.module.ts @@ -0,0 +1,10 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +const routes: Routes = []; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class SysSettingRoutingModule {} diff --git a/src/app/routes/sys-setting/sys-setting.module.ts b/src/app/routes/sys-setting/sys-setting.module.ts new file mode 100644 index 00000000..e39f6be4 --- /dev/null +++ b/src/app/routes/sys-setting/sys-setting.module.ts @@ -0,0 +1,9 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { SharedModule } from '@shared'; + +@NgModule({ + declarations: [], + imports: [CommonModule, SharedModule] +}) +export class SysSettingModule {} diff --git a/src/assets/mocks/menu-data.json b/src/assets/mocks/menu-data.json index 7037444d..0ec6983d 100644 --- a/src/assets/mocks/menu-data.json +++ b/src/assets/mocks/menu-data.json @@ -25,6 +25,61 @@ "link": "/demo/alain" } ] + }, + { + "text": "系统设置", + "icon": "anticon anticon-dashboard", + "group": true, + "children": [ + { + "text": "员工管理", + "link": "/demo/zorro" + }, + { + "text": "角色管理", + "link": "/demo/alain" + }, + { + "text": "基础设置", + "link": "/demo/alain" + }, + { + "text": "车型车长配置", + "link": "/demo/alain" + }, + { + "text": "基础配置", + "link": "/demo/alain" + }, + { + "text": "系统日志", + "link": "/demo/alain" + }, + { + "text": "用户登录日志", + "link": "/demo/alain" + }, + { + "text": "版本发布记录", + "link": "/demo/alain" + }, + { + "text": "协议配置", + "link": "/demo/alain" + }, + { + "text": "审核驳回理由配置", + "link": "/demo/alain" + }, + { + "text": "系统配置", + "link": "/demo/alain" + }, + { + "text": "货物名称配置", + "link": "/demo/alain" + } + ] } ] } From 30dcfbb4f16213b54bede5b0d9715ddc9485cfdc Mon Sep 17 00:00:00 2001 From: wangshiming Date: Tue, 30 Nov 2021 10:17:00 +0800 Subject: [PATCH 0005/1600] fix bug --- .../enterprise-audit/add/add.component.html | 24 ++ .../enterprise-audit/add/add.component.less | 6 + .../add/add.component.spec.ts | 23 ++ .../enterprise-audit/add/add.component.ts | 260 +++++++++++++++ .../enterprise-audit.component.html | 92 ++++++ .../enterprise-audit.component.less | 10 + .../enterprise-audit.component.spec.ts | 23 ++ .../enterprise-audit.component.ts | 310 ++++++++++++++++++ .../freight/list/detail/detail.component.html | 289 ++++++++++++++++ .../freight/list/detail/detail.component.less | 46 +++ .../list/detail/detail.component.spec.ts | 31 ++ .../freight/list/detail/detail.component.ts | 255 ++++++++++++++ .../freight/list/list.component.html | 9 +- .../components/freight/list/list.component.ts | 10 +- .../usercenter/usercenter-routing.module.ts | 7 +- .../routes/usercenter/usercenter.module.ts | 8 +- src/app/shared/shared-zorro.module.ts | 9 +- src/assets/mocks/menu-data.json | 12 +- 18 files changed, 1411 insertions(+), 13 deletions(-) create mode 100644 src/app/routes/usercenter/components/freight/enterprise-audit/add/add.component.html create mode 100644 src/app/routes/usercenter/components/freight/enterprise-audit/add/add.component.less create mode 100644 src/app/routes/usercenter/components/freight/enterprise-audit/add/add.component.spec.ts create mode 100644 src/app/routes/usercenter/components/freight/enterprise-audit/add/add.component.ts create mode 100644 src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.html create mode 100644 src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.less create mode 100644 src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.spec.ts create mode 100644 src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.ts create mode 100644 src/app/routes/usercenter/components/freight/list/detail/detail.component.html create mode 100644 src/app/routes/usercenter/components/freight/list/detail/detail.component.less create mode 100644 src/app/routes/usercenter/components/freight/list/detail/detail.component.spec.ts create mode 100644 src/app/routes/usercenter/components/freight/list/detail/detail.component.ts diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/add/add.component.html b/src/app/routes/usercenter/components/freight/enterprise-audit/add/add.component.html new file mode 100644 index 00000000..f005db7c --- /dev/null +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/add/add.component.html @@ -0,0 +1,24 @@ +
+ +
+ +
+ + + + + + +
+
+
+
diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/add/add.component.less b/src/app/routes/usercenter/components/freight/enterprise-audit/add/add.component.less new file mode 100644 index 00000000..f3529c7f --- /dev/null +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/add/add.component.less @@ -0,0 +1,6 @@ +:host { + .myForm { + width: 600px; + margin: 3rem 0; + } +} diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/add/add.component.spec.ts b/src/app/routes/usercenter/components/freight/enterprise-audit/add/add.component.spec.ts new file mode 100644 index 00000000..87adeeae --- /dev/null +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/add/add.component.spec.ts @@ -0,0 +1,23 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { CmcComponentsTagsAddComponent } from './edit-info.component'; + +describe('CmcComponentsTagsAddComponent', () => { + let component: CmcComponentsTagsAddComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [CmcComponentsTagsAddComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CmcComponentsTagsAddComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/add/add.component.ts b/src/app/routes/usercenter/components/freight/enterprise-audit/add/add.component.ts new file mode 100644 index 00000000..7158c64e --- /dev/null +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/add/add.component.ts @@ -0,0 +1,260 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { SFComponent, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper } from '@delon/theme'; +import { GoodsService } from 'src/app/routes/cmc/services/goods.service'; + +@Component({ + selector: 'app-cmc-components-add', + templateUrl: './add.component.html', + styleUrls: ['./add.component.less'], +}) +export class CmcComponentsTagsAddComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + i: any; + schema!: SFSchema; + ui!: SFUISchema; + cateData: any = []; + formTitle: any = '新增标签'; + formData: any = { + // avatar:[ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png', + // response: { + // url: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png', + // }, + // }, + // ], + // name:'西四' + }; + + constructor(public service: GoodsService, private modal: ModalHelper, private route: ActivatedRoute) { + const { flag, type, id } = route.snapshot?.queryParams; + Object.assign(this.formData, { flag, type, id }); + } + + ngOnInit() { + this.initSF(); + if (this.formData.flag !== '3') { + this.getCates(); + } else { + this.getBusinessCates(); + } + // console.log(this.formData, 'this.formData'); + if (this.formData.type === 'edit') { + this.formTitle = '编辑标签'; + } + if (this.formData.type === 'view') { + this.formTitle = '查看标签'; + } + if (this.formData.type !== 'add') { + if (this.formData.flag !== '3') { + this.getInfo(); + } else { + this.getBusinessInfo(); + } + } + } + initSF() { + this.schema = { + properties: { + name: { + title: '标签名称', + type: 'string', + maxLength: 8, + }, + categoryId: { + title: '关联分类', + type: 'string', + default: this.formData?.categoryId || [], + enum: this.cateData, + ui: { + widget: 'tree-select', + checkable: true, // 节点前添加 Checkbox 复选框 + allowClear: true, // 支持清除 + virtualHeight: '480px', + // checkStrictly: true, // checkable 状态下节点选择完全受控(父子节点选中状态不再关联) + // defaultExpandAll: false, // 默认展开所有树节点 + // expandedKeys: this.formData?.categoryId || [], // 默认展开指定的树节点 + change: (e) => { + console.log(e); + }, + // valueProperty: 'key', + // labelProperty: 'title', + // asyncData: () => + // this.service.request(this.service.$api_get_labelCategorys).pipe( + // map((data: any) => { + // return data.map((m: any) => { + // return { title: m.name, key: m.id }; + // }); + // }), + // ), + } as SFSelectWidgetSchema, + }, + remark: { + title: '标签介绍', + type: 'string', + maxLength: 50, + ui: { + widget: 'textarea', + placeholder: '请输入标签介绍', + autosize: { minRows: 3, maxRows: 6 }, + errors: { + required: '请输入标签介绍', + }, + }, + }, + }, + required: ['name', 'categoryId', 'remark'], + }; + this.ui = { + '*': { + spanLabel: 5, + grid: { span: 24 }, + }, + }; + } + getCates() { + const params = { + flag: this.formData.flag, + }; + const cateApi = this.service.$api_get_category_treeList; + this.service.request(cateApi, params).subscribe((res) => { + // res.map((i: any) => { + // i.key = i.id; + // i.title = i.name; + // if (i.children) { + // i.children.map((j: any) => { + // j.key = j.id; + // j.title = j.name; + // if (j.children) { + // j.children.map((k: any) => { + // k.key = k.id; + // k.title = k.name; + // }); + // } + // }); + // } + // }); + this.cateData = res; + this.initSF(); + }); + } + getBusinessCates() { + const params = { + flag: this.formData.flag, + }; + const cateApi = this.service.$api_get_business_cateList; + this.service.request(cateApi, params).subscribe((res) => { + // res.map((i: any) => { + // i.key = i.id; + // i.title = i.name; + // if (i.children) { + // i.children.map((j: any) => { + // j.key = j.id; + // j.title = j.name; + // if (j.children) { + // j.children.map((k: any) => { + // k.key = k.id; + // k.title = k.name; + // }); + // } + // }); + // } + // }); + this.cateData = res; + this.initSF(); + }); + } + getInfo() { + const params = { + labelId: this.formData.id, + }; + this.service.http.post(this.service.$api_get_labelDetail, params).subscribe((res) => { + const resData = res.data; + if (res.data?.categoryIds) { + resData.categoryId = res.data?.categoryIds.split(','); + } + delete resData.categoryIds; + Object.assign(this.formData, resData); + // console.log(this.formData, 'this.formData'); + this.initSF(); + }); + } + getBusinessInfo() { + const params = { + id: this.formData.id, + }; + this.service.http.post(this.service.$api_get_business_labelDetail, params).subscribe((res) => { + const resData = res.data; + if (res.data?.categoryIdList) { + resData.categoryId = res.data?.categoryIdList; + } + delete resData.categoryIdList; + Object.assign(this.formData, resData); + this.initSF(); + }); + } + formSubmit() { + const cateIds: any[] = []; + let saveApi = this.service.$api_label_save; + if (this.formData.flag !== '3') { + this.sf.value.categoryId.map((i: any) => { + this.cateData.map((j: any) => { + if (j.children) { + if (i === j.key) { + j.children.map((k: any) => { + if (k.children) { + k.children.map((m: any) => { + cateIds.push(m.key); + }); + } else { + cateIds.push(k.key); + } + }); + } else if (i !== j.key) { + j.children.map((k: any) => { + if (i === k.key && k.children) { + k.children.map((m: any) => { + cateIds.push(m.key); + }); + } else { + cateIds.push(i); + } + }); + } + } else { + if (i === j.key) { + cateIds.push(i); + } + } + }); + }); + } + const params: any = { + ...this.sf.value, + }; + if (this.formData.flag !== '3') { + const uniqueArr = [...new Set(cateIds)]; + params.categoryId = uniqueArr.toString(); + saveApi = this.service.$api_label_save; + } else { + saveApi = this.service.$api_business_label_save; + params.categoryIdList = this.sf.value.categoryId; + delete params.categoryId; + } + this.service.http.post(saveApi, params).subscribe((res) => { + if (res.data) { + this.service.msgSrv.success('提交成功'); + this.goBack(); + } + }); + } + goBack() { + history.go(-1); + } +} diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.html b/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.html new file mode 100644 index 00000000..23a73fad --- /dev/null +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.html @@ -0,0 +1,92 @@ + + + +
+ +
+ +
+ + + +
+ +
+
+ + + + +
+
+
+
+
+ + + + + + + + + + +
+ diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.less b/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.less new file mode 100644 index 00000000..dfd3be23 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.less @@ -0,0 +1,10 @@ +:host { + ::ng-deep { + .tabs-wrap > .ant-tabs-nav { + margin-bottom: 0; + } + .myForm .ant-upload.ant-upload-select-picture-card > .ant-upload { + flex-direction: column !important; + } + } +} diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.spec.ts b/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.spec.ts new file mode 100644 index 00000000..d10cb382 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.spec.ts @@ -0,0 +1,23 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { CmcComponentsTagsComponent } from './tags.component'; + +describe('CmcComponentsTagsComponent', () => { + let component: CmcComponentsTagsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [CmcComponentsTagsComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CmcComponentsTagsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.ts b/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.ts new file mode 100644 index 00000000..33c04f46 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/enterprise-audit.component.ts @@ -0,0 +1,310 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STChange, STColumn, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { UsermanageService } from '../../../services/usercenter.service'; + +@Component({ + selector: 'app-Freight-components-enterprise-audit', + templateUrl: './enterprise-audit.component.html', + styleUrls: ['./enterprise-audit.component.less'], +}) +export class FreightComponentsEnterpriseAuditComponent implements OnInit { + _$expand = false; + ui!: SFUISchema; + schema!: SFSchema; + columns!: STColumn[]; + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + tabType = 1; + tabs = [ + { + name: '企业审核', + type: 1, + isActived: false, + }, + { + name: '企业管理员审核', + type: 2, + isActived: false, + }, + ]; + datalist = [ + { + storeName: '企业名称', + contactsName: '152746565', + enterpriseName: '湖南', + unifiedSocialCreditCode: '45454', + contactsPhone: '*97889461561', + effectiveDateStr: '废弃eww', + enStatusStr2: '已驳回', + enStatusStr3: '正常', + unifiedSocialCreditCode3: '常用服务', + unifiedSocialCreditCode2: '正常', + tenantId: 1 + }, + { + storeName: '企业名称', + contactsName: '152746565', + enterpriseName: '湖南', + unifiedSocialCreditCode: '45454', + contactsPhone: '*97889461561', + effectiveDateStr: '废弃eww', + enStatusStr2: '待审核', + enStatusStr3: '正常', + unifiedSocialCreditCode3: '常用服务', + unifiedSocialCreditCode2: '正常', + tenantId: 2 + }, + ] + isVisible = false; + mdType!: any; + cateData = []; + // stApi = this.service.$api_get_labelList; + constructor(public service: UsermanageService, private router: Router, private modal: NzModalService) {} + + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + + /** + * 查询参数 + */ + get reqParams() { + const params = Object.assign({}, this.sf?.value || {}, { + flag: this.tabType, + }); + delete params._$expand; + return { ...params }; + } + + /** + * 选中行 + */ + get selectedRows() { + return this.st?.list.filter((item) => item.checked) || []; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + /** + * 程序初始化入口 + */ + ngOnInit() { + this.initSF(); + this.initST(); + } + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + expand: { type: 'boolean', ui: { hidden: true } }, + name: { title: '企业名称', type: 'string' }, + contactsName: { + title: '联系人', + type: 'string', + ui: { + showRequired: false, + }, + }, + phone: { + title: '手机号', + type: 'string', + format: 'mobile', + maxLength: 11, + ui: { + placeholder: '请输入手机号', + }, + }, + enStatus2: { + type: 'string', + title: '状态', + enum: [ + { label: '全部', value: '' }, + { label: '正常', value: 0 }, + { label: '冻结', value: 1 }, + { label: '废弃', value: 2 }, + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value, + }, + }, + }, + + }, + }; + this.ui = { '*': { spanLabelFixed: 100, grid: { span: 8, gutter: 4 } } }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '企业名称', className: 'text-center', index: 'storeName' }, + { title: '联系人', className: 'text-center', index: 'contactsName' }, + { title: '税源地', className: 'text-center', render: 'enterpriseName' }, + { title: '累计运单金额', className: 'text-center', index: 'unifiedSocialCreditCode' }, + { + title: '状态', + className: 'text-center', + index: 'enStatusStr2', + type: 'badge', + badge: { + 待审核: { text: '待审核', color: 'success' }, + 已驳回: { text: '已驳回', color: 'warning' }, + }, + }, + { title: '常用服务', className: 'text-center', index: 'unifiedSocialCreditCode3' }, + { title: '推广业务员', className: 'text-center', index: 'unifiedSocialCreditCode2' }, + { + title: '操作', + fixed: 'right', + width: '180px', + className: 'text-center', + buttons: [ + { text: '查看', click: (_record) => this.addOne('view', _record) }, + ], + }, + ]; + } + + /** + * 数据列表状态变化事件 + */ + change(e: STChange) { + // console.log(e.checkbox); + } + + /** + * 新增实例 + */ + addOne(type: any, record: any) { + // this.router.navigate(['../add'], { relativeTo: this.ar }); + this.router.navigate(['/cmc/tags/add'], { + queryParams: { + id: record.id, + type, + flag: this.tabType, + }, + }); + } + + /** + * 编辑单个实例 + * @param record 记录实例 + */ + editOne(record: STData) { + // this.router.navigate(['../edit', record.uuid], { relativeTo: this.ar }); + } + + /** + * 删除单个实例 + * @param record 记录实例 + */ + delOne(record: STData) { + // let delApi = this.service.$api_label_deletebatch; + // if (this.tabType === 3) { + // delApi = this.service.$api_business_label_delete; + // } else { + // delApi = this.service.$api_label_deletebatch; + // } + this.modal.confirm({ + nzTitle: '删除确认', + nzContent: `即将删除 当前行数据,请仔细核对,避免误操作!
是否删除?
`, + nzOnOk: () => + console.log('1') + // this.service.http.post(delApi, [record.id]).subscribe((res) => { + // console.log(res, 'del'); + + // if (res === true || res.data === true) { + // this.service.msgSrv.success('删除成功!'); + // setTimeout(() => { + // this.st?.reload(); + // }, 500); + // } else { + // this.service.msgSrv.error('删除失败!'); + // } + // }), + }); + } + + /** + * 删除多个实例 + */ + delMany(record: STData) { + this.modal.confirm({ + nzTitle: '删除确认', + nzContent: `即将删除 当前行数据,请仔细核对,避免误操作!
是否删除?
`, + nzOnOk: () => + console.log('') + // this.service.http.post(this.service.$api_label_deletebatch, [record.id]).subscribe((res) => { + // if (res === true) { + // this.service.msgSrv.success('删除成功!'); + // this.st?.reload(); + // } + // }), + }); + /* + const delData = this.st.list.filter((item) => item.checked).map((item) => item.id); + if (delData.length > 0) { + this.modal.confirm({ + nzTitle: '删除确认', + nzContent: `即将删除 ${delData.length} 条数据,请仔细核对,避免误操作!
是否删除?
`, + nzOnOk: () => + this.service.delMany(delData).subscribe((res) => { + if (res === true) { + this.service.msgSrv.success('数据删除成功!'); + this.st?.reload(); + } + }), + }); + } + */ + } + + // 切换Tab + changeTab(item: any) { + this.tabType = item.type; + this.sf?.reset(); + // if (item.type === 3) { + // this.stApi = this.service.$api_get_business_labelList; + // } else { + // this.stApi = this.service.$api_get_labelList; + // } + // setTimeout(() => { + // this.tabs.forEach((i) => (i.isActived = false)); + // item.isActived = !item.isActived; + // this.st.load(1); + // this.st.resetColumns(); + // }, 500); + } + + // checkType(): boolean { + // return this.mdType === 2 ? true : false; + // } + +} diff --git a/src/app/routes/usercenter/components/freight/list/detail/detail.component.html b/src/app/routes/usercenter/components/freight/list/detail/detail.component.html new file mode 100644 index 00000000..4aafe892 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/detail/detail.component.html @@ -0,0 +1,289 @@ + + + + + + + + + + + + +
+ + + +
确定冻结该企业吗?
+
+ 停用后,该企业将被限制使用,不限于访问受限、无法发布货源等,请谨慎操作 +
+
+
+ +
+ + + +
确定启用该企业吗?
+
+ 启用后,该企业将恢复正常使用功能,请再次确认 +
+
+
+ +
+ + + +
确定关闭该企业支付权限吗?
+
+ 停用后,该企业将被限制使用支付功能,请谨慎操作 +
+
+
+ +
+ + + +
确定开通该企业支付权限吗?
+
+ 启用后,该企业将恢复正常支付功能,请再次确认 +
+
+
+
+ + + 联系信息人 + + {{ detailData?.contactsName }} + + + {{ detailData?.contactsPhone }} + + + {{ detailData?.contactsPhone }} + + + + + + + + 公司基本信息 + + {{ detailData?.enterpriseName }} + + + {{ detailData?.unifiedSocialCreditCode }} + + + {{ detailData?.enterpriseType }} + + + {{ detailData?.registrationCapital }} + 万元 + + + {{ detailData?.enterpriseRegistrationTime }} + + +
+ {{ detailData?.operatingStartTime }} 至 {{ detailData?.operatingEndTime }} +
+
长期
+
{{ detailData?.operatingStartTime }} 至 长期
+
+
+ + + {{ detailData?.enterpriseAddressCodeStr }} + + + {{ detailData?.enterpriseAddress }} + + + + + {{ detailData?.enterpriseAddressCodeStr }} + + + {{ detailData?.enterpriseAddress }} + + + + + {{ detailData?.enterpriseAddressCodeStr }} + + + {{ detailData?.enterpriseAddress }} + + + + + {{ detailData?.businessScope }} + + + + + + + + 法人信息 + + {{ detailData?.name }} + + + {{ detailData?.certificateNumber }} + + + {{ detailData?.validStartTime }} - + {{ detailData?.validEndTime ? detailData?.validEndTime : '长期' }} + + + + + + + + 银行结算信息 + + {{ detailData?.name }} + + + {{ detailData?.certificateNumber }} + + + {{ detailData?.validStartTime }} + + +
+
+ + +
+ + +
+
diff --git a/src/app/routes/usercenter/components/freight/list/detail/detail.component.less b/src/app/routes/usercenter/components/freight/list/detail/detail.component.less new file mode 100644 index 00000000..48f605d9 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/detail/detail.component.less @@ -0,0 +1,46 @@ +@import '~@delon/theme/index'; +:host { + ::ng-deep { + .ant-steps-dot { + .ant-steps-item-content { + width: 200px; + } + .ant-steps-item-icon { + margin-left: 96px; + } + .ant-steps-item-tail::after { + margin-left: 40px; + } + } + .success { + color: @success-color; + } + + .warning { + color: @warning-color; + } + + .error { + color: @error-color; + } + } + .mt16 { + margin-top: 16px; + } + .user-info { + display: flex; + font-size: 16px; + .enterprise-name { + margin-right: 15px; + } + img { + width: 64px; + height: 64px; + margin-right: 15px; + border-radius: 50%; + } + .user-info-des { + margin-bottom: 5px; + } + } +} diff --git a/src/app/routes/usercenter/components/freight/list/detail/detail.component.spec.ts b/src/app/routes/usercenter/components/freight/list/detail/detail.component.spec.ts new file mode 100644 index 00000000..00666a0b --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/detail/detail.component.spec.ts @@ -0,0 +1,31 @@ +/* + * @Author: your name + * @Date: 2021-11-29 20:19:08 + * @LastEditTime: 2021-11-29 20:31:00 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\usercenter\components\freight\list\detail\detail.component.spec.ts + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { FreightComponentsListDetailComponent } from './detail.component'; + +describe('FreightComponentsListDetailComponent', () => { + let component: FreightComponentsListDetailComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FreightComponentsListDetailComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FreightComponentsListDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/usercenter/components/freight/list/detail/detail.component.ts b/src/app/routes/usercenter/components/freight/list/detail/detail.component.ts new file mode 100644 index 00000000..809f567f --- /dev/null +++ b/src/app/routes/usercenter/components/freight/list/detail/detail.component.ts @@ -0,0 +1,255 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { UsermanageService } from '../../../../services/usercenter.service'; + +@Component({ + selector: 'app-supplier-components-list-view', + templateUrl: './detail.component.html', + styleUrls: ['./detail.component.less'], +}) +export class FreightComponentsListDetailComponent implements OnInit { + i: any; + url = `/rule?_allow_anonymous=true`; + @ViewChild('st', { static: false }) st!: STComponent; + detailData: any; + isShow = false; + isVisible = false; + modalTitle = '有效期'; + modalName = ''; + ui!: SFUISchema; + schema!: SFSchema; + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema1!: SFSchema; + @ViewChild('sf1', { static: false }) sf1!: SFComponent; + validData: any = ['suppliersType']; + suppliersData: any = {}; + + constructor( + private http: _HttpClient, + private modal: ModalHelper, + public service: UsermanageService, + private route: ActivatedRoute, + private modalHelper: ModalHelper, + private msgSrv: NzMessageService, + ) {} + + ngOnInit() { + console.log(this.route.snapshot); + // this.initData(); + this.initSF(); + this.initSF1(); + // this.launchSign(); + } + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + effectiveDate: { + title: '有效期', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd 00:00:00', + // hidden: this.modalName === 'effectiveDate' ? false : true, + } as SFDateWidgetSchema, + }, + }, + required: ['effectiveDate'], + }; + this.ui = { '*': { spanLabelFixed: 120, grid: { span: 24 } } }; + } + initSF1() { + this.schema1 = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + suppliersType: { + type: 'string', + title: '类型', + enum: [ + { label: '非外部供应商', value: 0 }, + { label: '外部供应商', value: 1 }, + ], + default: '', + ui: { + widget: 'select', + change: (args: any) => { + console.log(args, 'args'); + this.suppliersData.suppliersType = args; + if (args === 1) { + this.validData = ['suppliersType', 'externalSuppliersId']; + } else { + this.validData = ['suppliersType']; + this.suppliersData.externalSuppliersId = ''; + } + this.initSF1(); + }, + }, + }, + externalSuppliersId: { + title: '外部供应商id', + type: 'string', + default: '', + ui: { + visibleIf: { suppliersType: (value: any) => value === 1 }, + }, + }, + }, + required: this.validData, + }; + } + showModal(name: any) { + this.modalName = name; + if (name === 'effectiveDate') { + this.isShow = true; + } else { + this.isVisible = true; + } + } + async initData() { + console.log(this.route.snapshot, 'this.route.snapshot'); + + const params = { + tenantId: this.route.snapshot.params.id, + // tenantId: this.route.snapshot.queryParams.tenantId, + }; + const res = await this.service.asyncRequest(this.service.$api_get_supplier_info, params); + // // 商品资质 + // if (res.enterpriseBusinessJson) { + // res.enterpriseBusinessJson.aptitudes = res.enterpriseBusinessJson?.aptitudes ? res.enterpriseBusinessJson.aptitudes.split(',') : []; + // } + // // // 申请人身份证证件 + // // res.applyUserJson.imagelist = []; + // // res.applyUserJson.imagelist.push(res.applyUserJson.certificatePhotoFront); + // // res.applyUserJson.imagelist.push(res.applyUserJson.certificatePhotoBack); + // // res.applyUserJson.imagelist.push(res.applyUserJson.handCertificate); + + // 法人身份证证件 + const imagelist = []; + imagelist.push(res?.certificatePhotoFront); + imagelist.push(res?.certificatePhotoBack); + res.certificatePhoto = imagelist; + + // 营业执照 + res.enterpriseQualificationCertificate = res.enterpriseQualificationCertificate + ? res.enterpriseQualificationCertificate.split(',') + : []; + + // 返回所在地 + res.enterpriseAddressCodeStr = await this.getRegionFullName(res.enterpriseAddressCode); + + this.detailData = res; + this.suppliersData = { + suppliersType: res?.suppliersType, + externalSuppliersId: res?.externalSuppliersId, + }; + } + + /** + * 根据地区code查询地区详情 + * @param code 地区代码 + */ + async getRegionFullName(code: any) { + const params = { + regionCode: code, + }; + const res = await this.service.asyncRequest(this.service.$api_get_region_detailByCode, params, 'POST', true); + // if (res && res.regionFullName) { + // const arr = res.regionFullName.split(','); + // res.regionFullName = arr.reverse().join('-'); + // } + return res && res.regionFullName; + } + add() { + // this.modal + // .createStatic(FormEditComponent, { i: { id: 0 } }) + // .subscribe(() => this.st.reload()); + } + goBack() { + window.history.go(-1); + } + /** + * 冻结 + */ + freezeOrResume(type: number) { + console.log(type) + // this.service.http + // .post(this.service.$api_set_freezeOrResume, { + // tenantId: this.route.snapshot.params.id, + // // tenantId: this.route.snapshot.queryParams.tenantId, + // status: type, + // }) + // .subscribe((res) => { + // if (res.data === true) { + // if (type === 0) { + // this.service.msgSrv.success(`启用成功!`); + // } else if (type === 1) { + // this.service.msgSrv.success(`冻结成功!`); + // } + // this.ngOnInit(); + // } else { + // this.service.msgSrv.error(res.msg || '操作失败!'); + // } + // }); + } + PayOrResume(type: number) { + console.log(type) + // this.service.http + // .post(this.service.$api_set_freezeOrResume, { + // tenantId: this.route.snapshot.params.id, + // // tenantId: this.route.snapshot.queryParams.tenantId, + // status: type, + // }) + // .subscribe((res) => { + // if (res.data === true) { + // if (type === 0) { + // this.service.msgSrv.success(`启用成功!`); + // } else if (type === 1) { + // this.service.msgSrv.success(`冻结成功!`); + // } + // this.ngOnInit(); + // } else { + // this.service.msgSrv.error(res.msg || '操作失败!'); + // } + // }); + } + + handleCancel(name: any) { + if (name === 'effectiveDate') { + this.isShow = false; + } else { + this.isVisible = false; + } + } + handleOK(name: any) { + const params: any = { + tenantId: this.route.snapshot.params.id, + // tenantId: this.route.snapshot.queryParams.tenantId, + }; + + if (name === 'effectiveDate') { + params.effectiveDate = this.sf?.value?.effectiveDate; + } else { + Object.assign(params, this.sf1?.value); + } + this.service.http.post(this.service.$api_set_freezeOrResume, params).subscribe((res) => { + if (res.data === true) { + this.service.msgSrv.success(`编辑成功!`); + this.ngOnInit(); + } else { + this.service.msgSrv.error(res.msg || '编辑失败!'); + } + if (name === 'effectiveDate') { + this.isShow = false; + } else { + this.isVisible = false; + } + }); + } +} diff --git a/src/app/routes/usercenter/components/freight/list/list.component.html b/src/app/routes/usercenter/components/freight/list/list.component.html index 1619105e..b0d2de52 100644 --- a/src/app/routes/usercenter/components/freight/list/list.component.html +++ b/src/app/routes/usercenter/components/freight/list/list.component.html @@ -1,7 +1,7 @@ this.addOne('view', _record) }, + { text: '查看', click: (_record) => this.View(_record) }, ], }, ]; @@ -202,14 +204,11 @@ export class FreightComponentsEnterpriseAuditComponent implements OnInit { /** * 新增实例 */ - addOne(type: any, record: any) { + View(record: any) { + console.log(record) // this.router.navigate(['../add'], { relativeTo: this.ar }); - this.router.navigate(['/cmc/tags/add'], { - queryParams: { - id: record.id, - type, - flag: this.tabType, - }, + this.router.navigate(['./view', record.tenantId], { + relativeTo: this.ar }); } @@ -289,6 +288,7 @@ export class FreightComponentsEnterpriseAuditComponent implements OnInit { // 切换Tab changeTab(item: any) { this.tabType = item.type; + console.log(item) this.sf?.reset(); // if (item.type === 3) { // this.stApi = this.service.$api_get_business_labelList; diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.html b/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.html new file mode 100644 index 00000000..2ee03ca9 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.html @@ -0,0 +1,245 @@ + + + + + + + + + + + + +
+ + + +
确定冻结该企业吗?
+
+ 停用后,该企业将被限制使用,不限于访问受限、无法发布货源等,请谨慎操作 +
+
+
+ +
+ + + +
确定启用该企业吗?
+
+ 启用后,该企业将恢复正常使用功能,请再次确认 +
+
+
+ +
+ + + +
确定关闭该企业支付权限吗?
+
+ 停用后,该企业将被限制使用支付功能,请谨慎操作 +
+
+
+ +
+ + + +
确定开通该企业支付权限吗?
+
+ 启用后,该企业将恢复正常支付功能,请再次确认 +
+
+
+
+ + + 联系信息人 + + {{ detailData?.contactsName }} + + + {{ detailData?.contactsPhone }} + + + {{ detailData?.contactsPhone }} + + + + + + + + 公司基本信息 + + {{ detailData?.enterpriseName }} + + + {{ detailData?.unifiedSocialCreditCode }} + + + {{ detailData?.enterpriseType }} + + + {{ detailData?.registrationCapital }} + 万元 + + + {{ detailData?.enterpriseRegistrationTime }} + + +
+ {{ detailData?.operatingStartTime }} 至 {{ detailData?.operatingEndTime }} +
+
长期
+
{{ detailData?.operatingStartTime }} 至 长期
+
+
+ + + {{ detailData?.enterpriseAddressCodeStr }} + + + {{ detailData?.enterpriseAddress }} + + + + + {{ detailData?.enterpriseAddressCodeStr }} + + + {{ detailData?.enterpriseAddress }} + + + + + {{ detailData?.enterpriseAddressCodeStr }} + + + {{ detailData?.enterpriseAddress }} + + + + + {{ detailData?.businessScope }} + + + + + + + + 法人信息 + + {{ detailData?.name }} + + + {{ detailData?.certificateNumber }} + + + {{ detailData?.validStartTime }} - + {{ detailData?.validEndTime ? detailData?.validEndTime : '长期' }} + + + + + + + + 银行结算信息 + + {{ detailData?.name }} + + + {{ detailData?.certificateNumber }} + + + {{ detailData?.validStartTime }} + + +
+
+ + +
+ + +
+
diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.less b/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.less new file mode 100644 index 00000000..48f605d9 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.less @@ -0,0 +1,46 @@ +@import '~@delon/theme/index'; +:host { + ::ng-deep { + .ant-steps-dot { + .ant-steps-item-content { + width: 200px; + } + .ant-steps-item-icon { + margin-left: 96px; + } + .ant-steps-item-tail::after { + margin-left: 40px; + } + } + .success { + color: @success-color; + } + + .warning { + color: @warning-color; + } + + .error { + color: @error-color; + } + } + .mt16 { + margin-top: 16px; + } + .user-info { + display: flex; + font-size: 16px; + .enterprise-name { + margin-right: 15px; + } + img { + width: 64px; + height: 64px; + margin-right: 15px; + border-radius: 50%; + } + .user-info-des { + margin-bottom: 5px; + } + } +} diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.spec.ts b/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.spec.ts new file mode 100644 index 00000000..a14af7b4 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.spec.ts @@ -0,0 +1,31 @@ +/* + * @Author: your name + * @Date: 2021-11-30 10:25:50 + * @LastEditTime: 2021-11-30 10:26:29 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\usercenter\components\freight\enterprise-audit\view\view.component.spec.ts + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { FreightComponentsEnterpriseAuditViewComponent } from './view.component'; + +describe('FreightComponentsEnterpriseAuditViewComponent', () => { + let component: FreightComponentsEnterpriseAuditViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FreightComponentsEnterpriseAuditViewComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FreightComponentsEnterpriseAuditViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.ts b/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.ts new file mode 100644 index 00000000..ad86a70b --- /dev/null +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.ts @@ -0,0 +1,255 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { UsermanageService } from '../../../../services/usercenter.service'; +import { SFComponent, SFSchema, SFDateWidgetSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form'; +import { Observable, Observer } from 'rxjs'; +@Component({ + selector: 'app-Freight-components-EnterpriseAudit-view', + templateUrl: './view.component.html', + styleUrls: ['./view.component.less'], +}) +export class FreightComponentsEnterpriseAuditViewComponent implements OnInit { + i: any; + url = `/rule?_allow_anonymous=true`; + @ViewChild('st', { static: false }) st!: STComponent; + detailData: any; + isShow = false; + isVisible = false; + modalTitle = '有效期'; + modalName = ''; + ui!: SFUISchema; + schema!: SFSchema; + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema1!: SFSchema; + @ViewChild('sf1', { static: false }) sf1!: SFComponent; + validData: any = ['suppliersType']; + suppliersData: any = {}; + + constructor( + private http: _HttpClient, + private modal: ModalHelper, + public service: UsermanageService, + private route: ActivatedRoute, + private modalHelper: ModalHelper, + private msgSrv: NzMessageService, + ) {} + + ngOnInit() { + console.log(this.route.snapshot); + // this.initData(); + this.initSF(); + this.initSF1(); + // this.launchSign(); + } + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + effectiveDate: { + title: '有效期', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd 00:00:00', + // hidden: this.modalName === 'effectiveDate' ? false : true, + } as SFDateWidgetSchema, + }, + }, + required: ['effectiveDate'], + }; + this.ui = { '*': { spanLabelFixed: 120, grid: { span: 24 } } }; + } + initSF1() { + this.schema1 = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + suppliersType: { + type: 'string', + title: '类型', + enum: [ + { label: '非外部供应商', value: 0 }, + { label: '外部供应商', value: 1 }, + ], + default: '', + ui: { + widget: 'select', + change: (args: any) => { + console.log(args, 'args'); + this.suppliersData.suppliersType = args; + if (args === 1) { + this.validData = ['suppliersType', 'externalSuppliersId']; + } else { + this.validData = ['suppliersType']; + this.suppliersData.externalSuppliersId = ''; + } + this.initSF1(); + }, + }, + }, + externalSuppliersId: { + title: '外部供应商id', + type: 'string', + default: '', + ui: { + visibleIf: { suppliersType: (value: any) => value === 1 }, + }, + }, + }, + required: this.validData, + }; + } + showModal(name: any) { + this.modalName = name; + if (name === 'effectiveDate') { + this.isShow = true; + } else { + this.isVisible = true; + } + } + async initData() { + console.log(this.route.snapshot, 'this.route.snapshot'); + + const params = { + tenantId: this.route.snapshot.params.id, + // tenantId: this.route.snapshot.queryParams.tenantId, + }; + const res = await this.service.asyncRequest(this.service.$api_get_supplier_info, params); + // // 商品资质 + // if (res.enterpriseBusinessJson) { + // res.enterpriseBusinessJson.aptitudes = res.enterpriseBusinessJson?.aptitudes ? res.enterpriseBusinessJson.aptitudes.split(',') : []; + // } + // // // 申请人身份证证件 + // // res.applyUserJson.imagelist = []; + // // res.applyUserJson.imagelist.push(res.applyUserJson.certificatePhotoFront); + // // res.applyUserJson.imagelist.push(res.applyUserJson.certificatePhotoBack); + // // res.applyUserJson.imagelist.push(res.applyUserJson.handCertificate); + + // 法人身份证证件 + const imagelist = []; + imagelist.push(res?.certificatePhotoFront); + imagelist.push(res?.certificatePhotoBack); + res.certificatePhoto = imagelist; + + // 营业执照 + res.enterpriseQualificationCertificate = res.enterpriseQualificationCertificate + ? res.enterpriseQualificationCertificate.split(',') + : []; + + // 返回所在地 + res.enterpriseAddressCodeStr = await this.getRegionFullName(res.enterpriseAddressCode); + + this.detailData = res; + this.suppliersData = { + suppliersType: res?.suppliersType, + externalSuppliersId: res?.externalSuppliersId, + }; + } + + /** + * 根据地区code查询地区详情 + * @param code 地区代码 + */ + async getRegionFullName(code: any) { + const params = { + regionCode: code, + }; + const res = await this.service.asyncRequest(this.service.$api_get_region_detailByCode, params, 'POST', true); + // if (res && res.regionFullName) { + // const arr = res.regionFullName.split(','); + // res.regionFullName = arr.reverse().join('-'); + // } + return res && res.regionFullName; + } + add() { + // this.modal + // .createStatic(FormEditComponent, { i: { id: 0 } }) + // .subscribe(() => this.st.reload()); + } + goBack() { + window.history.go(-1); + } + /** + * 冻结 + */ + freezeOrResume(type: number) { + console.log(type) + // this.service.http + // .post(this.service.$api_set_freezeOrResume, { + // tenantId: this.route.snapshot.params.id, + // // tenantId: this.route.snapshot.queryParams.tenantId, + // status: type, + // }) + // .subscribe((res) => { + // if (res.data === true) { + // if (type === 0) { + // this.service.msgSrv.success(`启用成功!`); + // } else if (type === 1) { + // this.service.msgSrv.success(`冻结成功!`); + // } + // this.ngOnInit(); + // } else { + // this.service.msgSrv.error(res.msg || '操作失败!'); + // } + // }); + } + PayOrResume(type: number) { + console.log(type) + // this.service.http + // .post(this.service.$api_set_freezeOrResume, { + // tenantId: this.route.snapshot.params.id, + // // tenantId: this.route.snapshot.queryParams.tenantId, + // status: type, + // }) + // .subscribe((res) => { + // if (res.data === true) { + // if (type === 0) { + // this.service.msgSrv.success(`启用成功!`); + // } else if (type === 1) { + // this.service.msgSrv.success(`冻结成功!`); + // } + // this.ngOnInit(); + // } else { + // this.service.msgSrv.error(res.msg || '操作失败!'); + // } + // }); + } + + handleCancel(name: any) { + if (name === 'effectiveDate') { + this.isShow = false; + } else { + this.isVisible = false; + } + } + handleOK(name: any) { + const params: any = { + tenantId: this.route.snapshot.params.id, + // tenantId: this.route.snapshot.queryParams.tenantId, + }; + + if (name === 'effectiveDate') { + params.effectiveDate = this.sf?.value?.effectiveDate; + } else { + Object.assign(params, this.sf1?.value); + } + this.service.http.post(this.service.$api_set_freezeOrResume, params).subscribe((res) => { + if (res.data === true) { + this.service.msgSrv.success(`编辑成功!`); + this.ngOnInit(); + } else { + this.service.msgSrv.error(res.msg || '编辑失败!'); + } + if (name === 'effectiveDate') { + this.isShow = false; + } else { + this.isVisible = false; + } + }); + } +} diff --git a/src/app/routes/usercenter/components/freight/list/list.component.ts b/src/app/routes/usercenter/components/freight/list/list.component.ts index 0adbc64c..bbb18f3c 100644 --- a/src/app/routes/usercenter/components/freight/list/list.component.ts +++ b/src/app/routes/usercenter/components/freight/list/list.component.ts @@ -48,7 +48,7 @@ export class FreightComponentsListComponent implements OnInit { constructor(public service: UsermanageService, private modal: NzModalService, private router: Router, private ar: ActivatedRoute) {} /** - * 查询字段个数 + * 查询字段个数navigate */ get queryFieldCount(): number { return Object.keys(this.schema?.properties || {}).length; diff --git a/src/app/routes/usercenter/usercenter-routing.module.ts b/src/app/routes/usercenter/usercenter-routing.module.ts index f0fda8c3..83e2ef69 100644 --- a/src/app/routes/usercenter/usercenter-routing.module.ts +++ b/src/app/routes/usercenter/usercenter-routing.module.ts @@ -1,7 +1,7 @@ /* * @Author: your name * @Date: 2021-11-29 15:22:34 - * @LastEditTime: 2021-11-30 09:56:44 + * @LastEditTime: 2021-11-30 10:29:19 * @LastEditors: Please set LastEditors * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: \tms-obc-web\src\app\routes\usercenter\usercenter-routing.module.ts @@ -9,6 +9,7 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { FreightComponentsEnterpriseAuditComponent } from './components/freight/enterprise-audit/enterprise-audit.component'; +import { FreightComponentsEnterpriseAuditViewComponent } from './components/freight/enterprise-audit/view/view.component'; import { FreightComponentsListDetailComponent } from './components/freight/list/detail/detail.component'; import { FreightComponentsListComponent } from './components/freight/list/list.component'; @@ -23,6 +24,7 @@ const routes: Routes = [ { path: 'freight/list/new', component: FreightComponentsListNewComponent }, { path: 'freight/list/detail/:id', component: FreightComponentsListDetailComponent }, { path: 'freight/enterprise', component: FreightComponentsEnterpriseAuditComponent }, + { path: 'freight/enterprise/view/:id', component: FreightComponentsEnterpriseAuditViewComponent }, ]; @NgModule({ diff --git a/src/app/routes/usercenter/usercenter.module.ts b/src/app/routes/usercenter/usercenter.module.ts index ca291e1b..3dac1057 100644 --- a/src/app/routes/usercenter/usercenter.module.ts +++ b/src/app/routes/usercenter/usercenter.module.ts @@ -9,6 +9,7 @@ import { NgModule } from '@angular/core'; import { SharedModule } from '@shared'; import { FreightComponentsEnterpriseAuditComponent } from './components/freight/enterprise-audit/enterprise-audit.component'; +import { FreightComponentsEnterpriseAuditViewComponent } from './components/freight/enterprise-audit/view/view.component'; import { FreightComponentsListDetailComponent } from './components/freight/list/detail/detail.component'; import { FreightComponentsListComponent } from './components/freight/list/list.component'; import { FreightComponentsListNewComponent } from './components/freight/list/new/new.component'; @@ -20,7 +21,8 @@ const COMPONENTS = [ FreightComponentsListViewComponent, FreightComponentsListNewComponent, FreightComponentsListDetailComponent, - FreightComponentsEnterpriseAuditComponent + FreightComponentsEnterpriseAuditComponent, + FreightComponentsEnterpriseAuditViewComponent ]; @NgModule({ diff --git a/src/assets/mocks/menu-data.json b/src/assets/mocks/menu-data.json index 091314a1..66bf37ae 100644 --- a/src/assets/mocks/menu-data.json +++ b/src/assets/mocks/menu-data.json @@ -63,6 +63,12 @@ "text": "企业审核列表", "icon": "anticon anticon-dashboard", "link": "/usercenter/freight/enterprise" + }, + { + "text": "企业审核列表详情", + "hide": true, + "icon": "anticon anticon-dashboard", + "link": "/usercenter/freight/enterprise/view/:id" } ] } From 83208b493478cea26685dec7bd3163f433c5e58a Mon Sep 17 00:00:00 2001 From: Taric Xin Date: Tue, 30 Nov 2021 11:11:02 +0800 Subject: [PATCH 0007/1600] =?UTF-8?q?=E5=91=98=E5=B7=A5=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _mock/_rule.ts | 6 +- angular.json | 4 +- .../alian-demo/alian-demo.component.html | 2 +- .../zorro-demo/zorro-demo.component.ts | 4 +- src/app/routes/routes-routing.module.ts | 5 +- .../staff-management.component.html | 40 +++++ .../staff-management.component.less | 13 ++ .../staff-management.component.ts | 155 ++++++++++++++++++ .../staff-modal/staff-modal.component.html | 24 +++ .../staff-modal/staff-modal.component.ts | 146 +++++++++++++++++ .../staff-modal/staff-modal.less | 25 +++ .../transpower/transpower.component.html | 27 +++ .../transpower/transpower.component.ts | 83 ++++++++++ .../transpower/transpower.less | 41 +++++ .../sys-setting/services/system.service.ts | 11 ++ .../sys-setting/sys-setting-routing.module.ts | 3 +- .../routes/sys-setting/sys-setting.module.ts | 9 +- .../freight/list/new/new.component.less | 82 +++++---- src/assets/mocks/menu-data.json | 2 +- src/style-icons-auto.ts | 2 +- src/styles.less | 15 +- src/styles/theme.less | 4 + 22 files changed, 650 insertions(+), 53 deletions(-) create mode 100644 src/app/routes/sys-setting/components/staff-management/staff-management.component.html create mode 100644 src/app/routes/sys-setting/components/staff-management/staff-management.component.less create mode 100644 src/app/routes/sys-setting/components/staff-management/staff-management.component.ts create mode 100644 src/app/routes/sys-setting/components/staff-management/staff-modal/staff-modal.component.html create mode 100644 src/app/routes/sys-setting/components/staff-management/staff-modal/staff-modal.component.ts create mode 100644 src/app/routes/sys-setting/components/staff-management/staff-modal/staff-modal.less create mode 100644 src/app/routes/sys-setting/components/staff-management/transpower/transpower.component.html create mode 100644 src/app/routes/sys-setting/components/staff-management/transpower/transpower.component.ts create mode 100644 src/app/routes/sys-setting/components/staff-management/transpower/transpower.less create mode 100644 src/app/routes/sys-setting/services/system.service.ts diff --git a/_mock/_rule.ts b/_mock/_rule.ts index c1e91847..4a145ba3 100644 --- a/_mock/_rule.ts +++ b/_mock/_rule.ts @@ -41,7 +41,7 @@ function getRule(params: any): any { if (params.no) { ret = ret.filter(data => data.no.indexOf(params.no) > -1); } - return { data: ret, success: true }; + return { data: { records: ret, total: ret.length }, success: true }; } function removeRule(nos: string): any { @@ -51,7 +51,7 @@ function removeRule(nos: string): any { list.splice(idx, 1); } }); - + return { data: true, success: true }; } @@ -78,6 +78,6 @@ function saveRule(description: string): void { export const RULES = { 'POST /rule': (req: MockRequest) => getRule(req.queryString), - 'POST /delete/rule': (req: MockRequest) => removeRule(req.body.nos), + 'POST /delete/rule': (req: MockRequest) => removeRule(req.body.nos) // 'POST /rule': (req: MockRequest) => saveRule(req.body.description) }; diff --git a/angular.json b/angular.json index b04d04a7..0405136b 100644 --- a/angular.json +++ b/angular.json @@ -58,8 +58,8 @@ "budgets": [ { "type": "initial", - "maximumWarning": "2mb", - "maximumError": "5mb" + "maximumWarning": "4mb", + "maximumError": "10mb" } ] }, diff --git a/src/app/routes/demo/components/alian-demo/alian-demo.component.html b/src/app/routes/demo/components/alian-demo/alian-demo.component.html index e2acb3be..e403a762 100644 --- a/src/app/routes/demo/components/alian-demo/alian-demo.component.html +++ b/src/app/routes/demo/components/alian-demo/alian-demo.component.html @@ -39,6 +39,6 @@
- \ No newline at end of file diff --git a/src/app/routes/demo/components/zorro-demo/zorro-demo.component.ts b/src/app/routes/demo/components/zorro-demo/zorro-demo.component.ts index cef1b137..1bfa7d26 100644 --- a/src/app/routes/demo/components/zorro-demo/zorro-demo.component.ts +++ b/src/app/routes/demo/components/zorro-demo/zorro-demo.component.ts @@ -69,8 +69,8 @@ export class ZorroDemoComponent implements OnInit { this.service .request('/rule?_allow_anonymous=true', this.q) .pipe( - map((list: Array<{ status: number; statusText: string; statusType: string }>) => - list.map(i => { + map((list: { records: Array<{ status: number; statusText: string; statusType: string }> }) => + list.records.map(i => { const statusItem = this.status[i.status]; i.statusText = statusItem.text; i.statusType = statusItem.type; diff --git a/src/app/routes/routes-routing.module.ts b/src/app/routes/routes-routing.module.ts index 351f4ee8..ee9104a3 100644 --- a/src/app/routes/routes-routing.module.ts +++ b/src/app/routes/routes-routing.module.ts @@ -25,12 +25,13 @@ const routes: Routes = [ { path: 'demo', loadChildren: () => import('./demo/demo.module').then(m => m.DemoModule) }, { path: 'account', - loadChildren: () => import('./account/account.module').then((m) => m.AccountModule), + loadChildren: () => import('./account/account.module').then(m => m.AccountModule) }, { path: 'usercenter', - loadChildren: () => import('./usercenter/usercenter.module').then((m) => m.UsercenterModule), + loadChildren: () => import('./usercenter/usercenter.module').then(m => m.UsercenterModule) }, + { path: 'system', loadChildren: () => import('./sys-setting/sys-setting.module').then(m => m.SysSettingModule) } ] }, // passport diff --git a/src/app/routes/sys-setting/components/staff-management/staff-management.component.html b/src/app/routes/sys-setting/components/staff-management/staff-management.component.html new file mode 100644 index 00000000..4bd860b2 --- /dev/null +++ b/src/app/routes/sys-setting/components/staff-management/staff-management.component.html @@ -0,0 +1,40 @@ + + + + +
+
+ +
+
+ + +
+
+
+ + +
+ +
+ + +
+
+ +
+ + + 已选择 + {{ selectedRows.length }}项 + + +
+ + +
\ No newline at end of file diff --git a/src/app/routes/sys-setting/components/staff-management/staff-management.component.less b/src/app/routes/sys-setting/components/staff-management/staff-management.component.less new file mode 100644 index 00000000..04fd4ba3 --- /dev/null +++ b/src/app/routes/sys-setting/components/staff-management/staff-management.component.less @@ -0,0 +1,13 @@ +:host::ng-deep{ + .search-box{ + .ant-card-body{ + padding-bottom: 18px; + } + } + + .content-box{ + .ant-card-body{ + padding-top: 14px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/staff-management/staff-management.component.ts b/src/app/routes/sys-setting/components/staff-management/staff-management.component.ts new file mode 100644 index 00000000..81cc4922 --- /dev/null +++ b/src/app/routes/sys-setting/components/staff-management/staff-management.component.ts @@ -0,0 +1,155 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../services/system.service'; +import { SystemStaffStaffModalComponent } from './staff-modal/staff-modal.component'; +import { BuyerTranspowerComponent } from './transpower/transpower.component'; + +@Component({ + selector: 'app-staff-management', + templateUrl: './staff-management.component.html', + styleUrls: ['./staff-management.component.less'] +}) +export class StaffManagementComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + url = `/rule?_allow_anonymous=true`; + + searchSchema: SFSchema = { + properties: { + receiveName: { + type: 'string', + title: '输入搜索', + ui: { placeholder: '手机号码 / 成员姓名' } + } + } + }; + + columns: STColumn[] = [ + { title: '', index: 'key', type: 'checkbox' }, + { title: '员工姓名', index: 'no' }, + { title: '手机号码', index: 'description' }, + { title: '角色', index: 'description' }, + { + title: '最后登录时间', + index: 'updatedAt', + type: 'date' + }, + { + title: '成员状态', + className: 'text-center', + index: 'status', + type: 'badge', + badge: { + 0: { text: '正常', color: 'success' }, + 2: { text: '废弃', color: 'warning' }, + 3: { text: '废弃', color: 'warning' }, + 1: { text: '冻结', color: 'error' } + } + }, + { + title: '操作', + buttons: [ + { + text: '编辑', + click: item => this.staffAction(item) + }, + { + text: '恢复', + iif: item => item.status === 1, + click: item => this.action(2) + }, + { + text: '冻结', + iif: item => item.status === 0, + click: item => this.action(1) + }, + { + text: '超管转授', + iif: item => item.status === 0, + click: item => this.transpowerAction(item) + }, + { + text: '删除', + iif: item => item.status === 1, + click: item => this.action(3) + } + ] + } + ]; + + selectedRows: any[] = []; + + reqParams = { pageIndex: 1, pageSize: 10 }; + + actionLabel = { + 1: { title: '确认冻结?', text: '冻结后用户在本系统将无法登录使用,请谨慎操作!' }, + 2: { title: '确认恢复?', text: '恢复后用户在本系统的权限将一并重新开启。' }, + 3: { title: '确认删除?', text: '删除后该用户ID将在本系统中将无法登录使用并删除,请谨慎操作!' } + }; + constructor(public service: SystemService, private nzModalService: NzModalService) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st.load(); + break; + } + } + + action(type: 1 | 2 | 3) { + this.nzModalService.error({ + nzTitle: this.actionLabel[type].title, + nzContent: ``, + nzClosable: false, + nzCancelText: '取消', + nzOnOk: () => { + switch (type) { + case 1: + break; + + default: + break; + } + } + }); + } + + transpowerAction(item: any) { + const modal = this.nzModalService.create({ + nzContent: BuyerTranspowerComponent, + nzComponentParams: { i: { ...item } }, + nzFooter: null + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + + staffAction(item?: any) { + const modal = this.nzModalService.create({ + nzContent: SystemStaffStaffModalComponent, + nzComponentParams: item ? { i: { ...item, roleId: '1,2,3', name: '用户名', phone: 18555555555 } } : { i: { id: 0 } }, + nzFooter: null + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } +} diff --git a/src/app/routes/sys-setting/components/staff-management/staff-modal/staff-modal.component.html b/src/app/routes/sys-setting/components/staff-management/staff-modal/staff-modal.component.html new file mode 100644 index 00000000..f3d377e0 --- /dev/null +++ b/src/app/routes/sys-setting/components/staff-management/staff-modal/staff-modal.component.html @@ -0,0 +1,24 @@ + +
+ + + + +
+ +
+ +
{{ i.phone }}
+
+
+
+
+
+
+
+ diff --git a/src/app/routes/sys-setting/components/staff-management/staff-modal/staff-modal.component.ts b/src/app/routes/sys-setting/components/staff-management/staff-modal/staff-modal.component.ts new file mode 100644 index 00000000..e9944ab5 --- /dev/null +++ b/src/app/routes/sys-setting/components/staff-management/staff-modal/staff-modal.component.ts @@ -0,0 +1,146 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { copy } from '@delon/util'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { EAEnterpriseService } from 'src/app/shared/services/business/enterprise.service'; +import { SystemService } from '../../../services/system.service'; + +@Component({ + selector: 'app-system-add', + templateUrl: './staff-modal.component.html', + styleUrls: ['./staff-modal.less'] +}) +export class SystemStaffStaffModalComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + i: any; + schema!: SFSchema; + ui!: SFUISchema; + roleList = []; + roleNames: any = []; + constructor( + private modal: NzModalRef, + public msgSrv: NzMessageService, + public service: SystemService, + private enterpriseSrv: EAEnterpriseService + ) {} + + ngOnInit(): void { + if (this.i?.id !== 0) { + this.i.roleIds = this.i.roleId !== '' ? this.i.roleId.split(',') : []; + } + + this.initSF(this.i); + } + initSF(staff: any) { + console.log(staff); + this.schema = { + properties: { + name: { + title: '员工姓名', + type: 'string', + maxLength: 32, + ui: { widget: staff?.name ? 'text' : 'string', placeholder: '请输入员工姓名' }, + default: staff.name + }, + phone: { + title: '手机号码', + type: 'string', + format: 'mobile', + maxLength: 11, + ui: { widget: staff?.phone ? 'text' : 'string', placeholder: '请输入员工手机号' }, + default: staff.phone + }, + roleIds: { + title: '角色', + type: 'string', + ui: { + widget: 'select', + placeholder: '请选择员工角色', + mode: 'multiple', + maxMultipleCount: 5, + // asyncData: () => { + // return this.service.request(this.service.$api_getAppRoleList).pipe( + // map((res: any) => { + // this.roleList = res; + // return res.map((item: any) => { + // return { label: item.roleName, value: item.id }; + // }); + // }), + // ); + // }, + change: (i: any) => { + this.sf.value.roleIds = i; + this.sf?.setValue('/roleIds', i); + } + }, + default: staff?.roleIds + } + }, + required: ['name', 'phone', 'roleIds'] + }; + this.ui = { + '*': { + spanLabelFixed: 120, + grid: { span: 24 } + } + }; + } + + sure() { + if (!this.sf.value.roleIds || this.sf.value.roleIds.length === 0) { + this.service.msgSrv.error('员工角色不能为空!'); + return; + } + this.roleNames = []; + this.roleList.forEach((item: { id: any; roleName: string }) => { + this.sf.value.roleIds.forEach((ele: any) => { + if (ele === item.id) { + this.roleNames.push(item.roleName); + } + }); + }); + if (this.i.id === 0) { + const params: any = { + ...this.sf.value, + roleId: this.sf.value.roleIds, + roleNames: this.roleNames.join(','), + telephone: this.sf.value.phone, + staffName: this.sf.value.name + }; + // this.service.request(this.service.$api_addStaff, params).subscribe((res) => { + // console.log(res); + // if (res) { + // this.service.msgSrv.success('保存成功!'); + // this.modal.close(true); + // } + // // this.showInviteFlag = true; + // // this.inviteCode = res.inviteCode; + // }); + } else { + const params: any = { + appUserId: this.i.appUserId, + staffName: this.sf.value.name, + roleId: this.sf.value.roleIds, + telephone: this.i.telephone + }; + // this.service.request(this.service.$api_editorStaff, params).subscribe((res) => { + // this.service.msgSrv.success('编辑成功!'); + // // this.loadMyIdentity(); + // this.modal.close(true); + // }); + } + } + loadMyIdentity() { + this.enterpriseSrv.loadEnterpises().subscribe((data: any[]) => { + this.enterpriseSrv.setCache(data); + }); + } + + close() { + this.modal.destroy(); + } +} diff --git a/src/app/routes/sys-setting/components/staff-management/staff-modal/staff-modal.less b/src/app/routes/sys-setting/components/staff-management/staff-modal/staff-modal.less new file mode 100644 index 00000000..79ab5bb0 --- /dev/null +++ b/src/app/routes/sys-setting/components/staff-management/staff-modal/staff-modal.less @@ -0,0 +1,25 @@ +.info { + width: 100%; + margin: 0 auto 10px auto; + color: #333; + text-indent: 24px; +} +.staffBox { + display: flex; + img { + width: 30px; + height: 30px; + overflow: hidden; + border-radius: 50px; + } + dl { + margin: 0 0 0 5px; + dt { + font-size: 14px; + line-height: 28px; + } + dd { + font-size: 12px; + } + } +} diff --git a/src/app/routes/sys-setting/components/staff-management/transpower/transpower.component.html b/src/app/routes/sys-setting/components/staff-management/transpower/transpower.component.html new file mode 100644 index 00000000..767478a2 --- /dev/null +++ b/src/app/routes/sys-setting/components/staff-management/transpower/transpower.component.html @@ -0,0 +1,27 @@ + +
+ 张三(13411223344) + +
为了账户安全,需超管手机验证({{ superPhone }})
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+ \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/staff-management/transpower/transpower.component.ts b/src/app/routes/sys-setting/components/staff-management/transpower/transpower.component.ts new file mode 100644 index 00000000..7b9106d4 --- /dev/null +++ b/src/app/routes/sys-setting/components/staff-management/transpower/transpower.component.ts @@ -0,0 +1,83 @@ +import { ChangeDetectorRef, Component, OnInit, TemplateRef } from '@angular/core'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { interval } from 'rxjs'; +import { take } from 'rxjs/operators'; +import { DunHelper } from 'src/app/shared/components/captcha/dun.helper'; +import { EACaptchaService } from 'src/app/shared/services/business/captcha.service'; + +@Component({ + selector: 'app-buyer-transpower', + templateUrl: './transpower.component.html', + styleUrls: ['./transpower.less'] +}) +export class BuyerTranspowerComponent implements OnInit { + record: any = {}; + count = 0; + interval$: any; + i: any; + smsVerifyCode = ''; + superPhone = ''; + staffId = 1; + staffList: any = []; + constructor( + private modal: NzModalRef, + public captchaService: EACaptchaService, + private dunHelper: DunHelper, + private cdr: ChangeDetectorRef + ) {} + + ngOnInit(): void { + this.getPhone(); + } + getPhone() { + // this.service.request(this.service.$api_getAppLesseeAdmin).subscribe((res) => { + // console.log(res); + // if (res) { + // this.superPhone = res.telephone; + // } + // }); + } + sure() { + const params = { + appUserId: this.i.appUserId, + smsVerifyCode: this.smsVerifyCode + }; + // this.service.request(this.service.$api_shiftResellerAdmin, params).subscribe((res) => { + // if (res) { + // this.service.msgSrv.success('操作成功!'); + // this.modal.close(true); + // } + // }); + } + close() { + this.modal.destroy(); + } + /** + * 获取手机验证码 + */ + sendCode() { + this.captchaService.getAppLesseeAdminSMVerificationCode().subscribe(res => { + if (res.success && res.data.code === '1') { + this.captchaService.msgSrv.success('发送验证码成功'); + this.createInterval(); + } else if (res.data.code === '503046') { + this.dunHelper.popUp().subscribe(_ => { + this.createInterval(); + this.dunHelper.destory(); + }); + } else { + this.captchaService.msgSrv.warning(res.msg); + } + }); + } + + private createInterval() { + this.count = 59; + interval(1000) + .pipe(take(60)) + .subscribe(x => { + this.count = 59 - (x + 1); + this.cdr.detectChanges(); + }); + } +} diff --git a/src/app/routes/sys-setting/components/staff-management/transpower/transpower.less b/src/app/routes/sys-setting/components/staff-management/transpower/transpower.less new file mode 100644 index 00000000..665d6a15 --- /dev/null +++ b/src/app/routes/sys-setting/components/staff-management/transpower/transpower.less @@ -0,0 +1,41 @@ +.info { + width : 90%; + margin : 0 auto; + color : #333; + text-indent: 24px; +} + +.staffBox { + display : flex; + align-items: center; + + img { + width : 30px; + height : 30px; + overflow : hidden; + border-radius: 50px; + } + + dl { + margin: 0 0 0 5px; + + dt { + font-size : 14px; + line-height: 28px; + } + + dd { + font-size: 12px; + } + } +} + +.inputBox { + position: relative; + + a { + position: absolute; + top : 0; + right : 5px; + } +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/services/system.service.ts b/src/app/routes/sys-setting/services/system.service.ts new file mode 100644 index 00000000..b6bbf64e --- /dev/null +++ b/src/app/routes/sys-setting/services/system.service.ts @@ -0,0 +1,11 @@ +import { Injectable, Injector } from '@angular/core'; +import { BaseService } from 'src/app/shared/services'; + +@Injectable({ + providedIn: 'root' +}) +export class SystemService extends BaseService { + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/sys-setting/sys-setting-routing.module.ts b/src/app/routes/sys-setting/sys-setting-routing.module.ts index 5c565818..7e35a056 100644 --- a/src/app/routes/sys-setting/sys-setting-routing.module.ts +++ b/src/app/routes/sys-setting/sys-setting-routing.module.ts @@ -1,7 +1,8 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; +import { StaffManagementComponent } from './components/staff-management/staff-management.component'; -const routes: Routes = []; +const routes: Routes = [{ path: 'staff-management', component: StaffManagementComponent }]; @NgModule({ imports: [RouterModule.forChild(routes)], diff --git a/src/app/routes/sys-setting/sys-setting.module.ts b/src/app/routes/sys-setting/sys-setting.module.ts index e39f6be4..b71876d6 100644 --- a/src/app/routes/sys-setting/sys-setting.module.ts +++ b/src/app/routes/sys-setting/sys-setting.module.ts @@ -1,9 +1,14 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { SharedModule } from '@shared'; +import { StaffManagementComponent } from './components/staff-management/staff-management.component'; +import { SysSettingRoutingModule } from './sys-setting-routing.module'; +import { BuyerTranspowerComponent } from './components/staff-management/transpower/transpower.component'; +import { SystemStaffStaffModalComponent } from './components/staff-management/staff-modal/staff-modal.component'; +const COMPONENTS = [StaffManagementComponent, BuyerTranspowerComponent, SystemStaffStaffModalComponent]; @NgModule({ - declarations: [], - imports: [CommonModule, SharedModule] + declarations: COMPONENTS, + imports: [CommonModule, SysSettingRoutingModule, SharedModule] }) export class SysSettingModule {} diff --git a/src/app/routes/usercenter/components/freight/list/new/new.component.less b/src/app/routes/usercenter/components/freight/list/new/new.component.less index 1014aacf..55bf514e 100644 --- a/src/app/routes/usercenter/components/freight/list/new/new.component.less +++ b/src/app/routes/usercenter/components/freight/list/new/new.component.less @@ -3,20 +3,21 @@ nz-card { .page-title { margin-bottom: 39px; - color: #333; - font-weight: 500; - font-size: 20px; - line-height: 28px; - text-align: center; + color : #333; + font-weight : 500; + font-size : 20px; + line-height : 28px; + text-align : center; } + .step-title { display: block; - width: 800px !important; - margin: 0 auto; + width : 800px !important; + margin : 0 auto; } .myForm { - width: 680px; + width : 680px; margin: 5rem auto; } @@ -27,69 +28,82 @@ .btn-submit { margin-top: 16px; } + .pr { position: relative; } + .pa { position: absolute; - top: 35px; - left: 150px; + top : 35px; + left : 150px; } + .tips { - display: flex; + display : flex; margin-bottom: 0; - color: #333; + color : #333; + dt { width: 150px; } + dd { - width: 190px; + width : 190px; margin-bottom: 0; - text-align: center; + text-align : center; } } + .form-title { margin-bottom: 10px; - padding-left: 8px; - color: #333; - font-weight: 700; - font-size: 18px; - line-height: 20px; - border-left: solid 3px #1890ff; + padding-left : 8px; + color : #333; + font-weight : 700; + font-size : 18px; + line-height : 20px; + border-left : solid 3px #1890ff; } + .form-content { padding: 48px 32px; } + .apply-sv { - margin: 16px 0; - padding: 20px; - background: #f8f8f8; + margin : 16px 0; + padding : 20px; + background : #f8f8f8; border-radius: 2px; } + .result-date { font-size: 12px; } + .result-tips { - color: #ff4d4f; + color : #ff4d4f; font-size: 14px; } + .sv-img { - display: inline-block; - width: 104px; - height: 104px; - margin-right: 20px; - padding: 8px; - background: #fff; - border: 1px solid rgba(0, 0, 0, 0.15); + display : inline-block; + width : 104px; + height : 104px; + margin-right : 20px; + padding : 8px; + background : #fff; + border : 1px solid rgba(0, 0, 0, 0.15); border-radius: 2px; + img { - width: 100%; + width : 100%; height: 100%; } } } - /deep/ .ant-row { + + .ant-row { margin-left: 100px; } } -} +} \ No newline at end of file diff --git a/src/assets/mocks/menu-data.json b/src/assets/mocks/menu-data.json index b0130592..f043b580 100644 --- a/src/assets/mocks/menu-data.json +++ b/src/assets/mocks/menu-data.json @@ -69,7 +69,7 @@ "children": [ { "text": "员工管理", - "link": "/demo/zorro" + "link": "/system/staff-management" }, { "text": "角色管理", diff --git a/src/style-icons-auto.ts b/src/style-icons-auto.ts index 6dee7dec..a07c78c9 100644 --- a/src/style-icons-auto.ts +++ b/src/style-icons-auto.ts @@ -104,5 +104,5 @@ export const ICONS_AUTO = [ UsbOutline, UserOutline, WeiboCircleOutline, - EyeInvisibleOutline + EyeInvisibleOutline, ]; diff --git a/src/styles.less b/src/styles.less index de0c513b..4368dd61 100644 --- a/src/styles.less +++ b/src/styles.less @@ -6,8 +6,15 @@ @import './styles/index'; @import './styles/theme'; +@layout-gutter: 8px; +/* 全局滚动条美化 */ +*::-webkit-scrollbar { + width : (@layout-gutter); + height: (@layout-gutter); +} -// .page-header { -// margin-left: -24px; -// margin-top : -24px; -// } \ No newline at end of file +*::-webkit-scrollbar-thumb { + background : #d9d9d9; + cursor : pointer; + border-radius: (@layout-gutter) / 2; +} \ No newline at end of file diff --git a/src/styles/theme.less b/src/styles/theme.less index 89ff4bdd..74b0ba47 100644 --- a/src/styles/theme.less +++ b/src/styles/theme.less @@ -8,3 +8,7 @@ // ==========Custom brand visual color========== // ==========Custom brand visual color========== + +.error-color { + color: #ff4d4f; +} \ No newline at end of file From 8cb0cb7865d4547fc6b780e70e31f70e84dad36e Mon Sep 17 00:00:00 2001 From: wangshiming Date: Tue, 30 Nov 2021 14:59:57 +0800 Subject: [PATCH 0008/1600] fix bug --- .../enterprise-audit/view/view.component.html | 182 +++++------------- .../enterprise-audit/view/view.component.ts | 179 ++++++----------- 2 files changed, 103 insertions(+), 258 deletions(-) diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.html b/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.html index 2ee03ca9..42e05a59 100644 --- a/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.html +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.html @@ -1,6 +1,6 @@ - +
- - - -
- - - -
确定冻结该企业吗?
-
- 停用后,该企业将被限制使用,不限于访问受限、无法发布货源等,请谨慎操作 -
-
-
- -
- - - -
确定启用该企业吗?
-
- 启用后,该企业将恢复正常使用功能,请再次确认 -
-
-
- -
- - - -
确定关闭该企业支付权限吗?
-
- 停用后,该企业将被限制使用支付功能,请谨慎操作 -
-
-
- -
- - - -
确定开通该企业支付权限吗?
-
- 启用后,该企业将恢复正常支付功能,请再次确认 -
-
-
- 联系信息人 - + 申请人信息 + {{ detailData?.contactsName }} - + {{ detailData?.contactsPhone }} - + {{ detailData?.contactsPhone }} + + + + + @@ -180,22 +87,6 @@ {{ detailData?.enterpriseAddress }} - - - {{ detailData?.enterpriseAddressCodeStr }} - - - {{ detailData?.enterpriseAddress }} - - - - - {{ detailData?.enterpriseAddressCodeStr }} - - - {{ detailData?.enterpriseAddress }} - - {{ detailData?.businessScope }} @@ -221,25 +112,42 @@ - - - 银行结算信息 - - {{ detailData?.name }} - - - {{ detailData?.certificateNumber }} - - - {{ detailData?.validStartTime }} - - +
+
+ + + +
+
- - -
+ + + + + + - -
+ + +
+ + + + + + + + + diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.ts b/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.ts index ad86a70b..46db87ab 100644 --- a/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.ts +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.ts @@ -4,7 +4,7 @@ import { STColumn, STComponent } from '@delon/abc/st'; import { ModalHelper, _HttpClient } from '@delon/theme'; import { NzMessageService } from 'ng-zorro-antd/message'; import { UsermanageService } from '../../../../services/usercenter.service'; -import { SFComponent, SFSchema, SFDateWidgetSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form'; +import { SFComponent, SFSchema, SFDateWidgetSchema, SFUISchema, SFUploadWidgetSchema, SFSelectWidgetSchema, SFTextWidgetSchema, SFTagWidgetSchema } from '@delon/form'; import { Observable, Observer } from 'rxjs'; @Component({ selector: 'app-Freight-components-EnterpriseAudit-view', @@ -16,15 +16,16 @@ export class FreightComponentsEnterpriseAuditViewComponent implements OnInit { url = `/rule?_allow_anonymous=true`; @ViewChild('st', { static: false }) st!: STComponent; detailData: any; - isShow = false; isVisible = false; + isVisibleNo = false; modalTitle = '有效期'; modalName = ''; ui!: SFUISchema; + ui2!: SFUISchema; schema!: SFSchema; @ViewChild('sf', { static: false }) sf!: SFComponent; - schema1!: SFSchema; - @ViewChild('sf1', { static: false }) sf1!: SFComponent; + schema2!: SFSchema; + @ViewChild('sf2', { static: false }) sf2!: SFComponent; validData: any = ['suppliersType']; suppliersData: any = {}; @@ -41,7 +42,7 @@ export class FreightComponentsEnterpriseAuditViewComponent implements OnInit { console.log(this.route.snapshot); // this.initData(); this.initSF(); - this.initSF1(); + this.initSFNo(); // this.launchSign(); } /** @@ -50,68 +51,58 @@ export class FreightComponentsEnterpriseAuditViewComponent implements OnInit { initSF() { this.schema = { properties: { - _$expand: { type: 'boolean', ui: { hidden: true } }, - effectiveDate: { - title: '有效期', + '公司名称': { type: 'number', ui: { widget: 'text', defaultText: '深圳市星链供应链云科技有限公' } as SFTextWidgetSchema }, + status: { type: 'string', + title: '税源地', + enum: [ + { label: '待支付', value: 'WAIT_BUYER_PAY', otherData: 1 }, + { label: '已支付', value: 'TRADE_SUCCESS' }, + { label: '交易完成', value: 'TRADE_FINISHED' }, + ], + default: 'WAIT_BUYER_PAY', ui: { - widget: 'date', - format: 'yyyy-MM-dd 00:00:00', - // hidden: this.modalName === 'effectiveDate' ? false : true, - } as SFDateWidgetSchema, + widget: 'select', + change: (value, orgData) => console.log(value, orgData), + } as SFSelectWidgetSchema, }, }, - required: ['effectiveDate'], + required: ['status'], }; this.ui = { '*': { spanLabelFixed: 120, grid: { span: 24 } } }; } - initSF1() { - this.schema1 = { + initSFNo() { + this.schema2 = { properties: { - _$expand: { type: 'boolean', ui: { hidden: true } }, - suppliersType: { + '公司名称': { type: 'number', ui: { widget: 'text', defaultText: '深圳市星链供应链云科技有限公' } as SFTextWidgetSchema }, + roleDescription: { + title: '地址', type: 'string', - title: '类型', - enum: [ - { label: '非外部供应商', value: 0 }, - { label: '外部供应商', value: 1 }, - ], - default: '', + maxLength: 30, ui: { - widget: 'select', - change: (args: any) => { - console.log(args, 'args'); - this.suppliersData.suppliersType = args; - if (args === 1) { - this.validData = ['suppliersType', 'externalSuppliersId']; - } else { - this.validData = ['suppliersType']; - this.suppliersData.externalSuppliersId = ''; - } - this.initSF1(); - }, + placeholder: '请输入地址', + widget: 'textarea', }, }, - externalSuppliersId: { - title: '外部供应商id', - type: 'string', - default: '', + like: { + type: 'number', + title: '兴趣', + enum: [ + { value: 1, label: '电影' }, + { value: 2, label: '书' }, + { value: 3, label: '旅行' }, + ], ui: { - visibleIf: { suppliersType: (value: any) => value === 1 }, - }, + widget: 'tag', + } as SFTagWidgetSchema, + default: [1, 2], }, }, - required: this.validData, + required: ['roleDescription'], }; + this.ui2 = { '*': { spanLabelFixed: 120, grid: { span: 24 } } }; } - showModal(name: any) { - this.modalName = name; - if (name === 'effectiveDate') { - this.isShow = true; - } else { - this.isVisible = true; - } - } + async initData() { console.log(this.route.snapshot, 'this.route.snapshot'); @@ -166,90 +157,36 @@ export class FreightComponentsEnterpriseAuditViewComponent implements OnInit { // } return res && res.regionFullName; } - add() { - // this.modal - // .createStatic(FormEditComponent, { i: { id: 0 } }) - // .subscribe(() => this.st.reload()); - } goBack() { window.history.go(-1); } - /** - * 冻结 - */ - freezeOrResume(type: number) { - console.log(type) - // this.service.http - // .post(this.service.$api_set_freezeOrResume, { - // tenantId: this.route.snapshot.params.id, - // // tenantId: this.route.snapshot.queryParams.tenantId, - // status: type, - // }) - // .subscribe((res) => { - // if (res.data === true) { - // if (type === 0) { - // this.service.msgSrv.success(`启用成功!`); - // } else if (type === 1) { - // this.service.msgSrv.success(`冻结成功!`); - // } - // this.ngOnInit(); - // } else { - // this.service.msgSrv.error(res.msg || '操作失败!'); - // } - // }); - } - PayOrResume(type: number) { - console.log(type) - // this.service.http - // .post(this.service.$api_set_freezeOrResume, { - // tenantId: this.route.snapshot.params.id, - // // tenantId: this.route.snapshot.queryParams.tenantId, - // status: type, - // }) - // .subscribe((res) => { - // if (res.data === true) { - // if (type === 0) { - // this.service.msgSrv.success(`启用成功!`); - // } else if (type === 1) { - // this.service.msgSrv.success(`冻结成功!`); - // } - // this.ngOnInit(); - // } else { - // this.service.msgSrv.error(res.msg || '操作失败!'); - // } - // }); - } + + handleCancel(name: any) { - if (name === 'effectiveDate') { - this.isShow = false; + if (name === 'suppliersTypeNo') { + this.isVisibleNo = false; } else { this.isVisible = false; } } - handleOK(name: any) { + handleOK() { const params: any = { tenantId: this.route.snapshot.params.id, // tenantId: this.route.snapshot.queryParams.tenantId, }; + console.log(this.sf.value) + // this.service.http.post(this.service.$api_set_freezeOrResume, params).subscribe((res) => { + + // }); + } + auditPass() { + this.isVisible = true + } + auditNo() { + this.isVisibleNo = true + } + ratify() { - if (name === 'effectiveDate') { - params.effectiveDate = this.sf?.value?.effectiveDate; - } else { - Object.assign(params, this.sf1?.value); - } - this.service.http.post(this.service.$api_set_freezeOrResume, params).subscribe((res) => { - if (res.data === true) { - this.service.msgSrv.success(`编辑成功!`); - this.ngOnInit(); - } else { - this.service.msgSrv.error(res.msg || '编辑失败!'); - } - if (name === 'effectiveDate') { - this.isShow = false; - } else { - this.isVisible = false; - } - }); } } From a0845f956fca76340fc2f137511a05a2fcbfe754 Mon Sep 17 00:00:00 2001 From: wangshiming Date: Tue, 30 Nov 2021 15:13:48 +0800 Subject: [PATCH 0009/1600] fix bug --- .../freight/user/detail/detail.component.html | 289 ++++ .../freight/user/detail/detail.component.less | 46 + .../user/detail/detail.component.spec.ts | 31 + .../freight/user/detail/detail.component.ts | 255 +++ .../freight/user/new/new.component.html | 109 ++ .../freight/user/new/new.component.less | 109 ++ .../freight/user/new/new.component.ts | 1400 +++++++++++++++++ .../freight/user/user.component.html | 84 + .../freight/user/user.component.spec.ts | 23 + .../components/freight/user/user.component.ts | 228 +++ .../freight/user/view/view.component.html | 49 + .../freight/user/view/view.component.less | 46 + .../freight/user/view/view.component.spec.ts | 23 + .../freight/user/view/view.component.ts | 257 +++ .../usercenter/usercenter-routing.module.ts | 4 +- .../routes/usercenter/usercenter.module.ts | 4 +- src/assets/mocks/menu-data.json | 5 + 17 files changed, 2960 insertions(+), 2 deletions(-) create mode 100644 src/app/routes/usercenter/components/freight/user/detail/detail.component.html create mode 100644 src/app/routes/usercenter/components/freight/user/detail/detail.component.less create mode 100644 src/app/routes/usercenter/components/freight/user/detail/detail.component.spec.ts create mode 100644 src/app/routes/usercenter/components/freight/user/detail/detail.component.ts create mode 100644 src/app/routes/usercenter/components/freight/user/new/new.component.html create mode 100644 src/app/routes/usercenter/components/freight/user/new/new.component.less create mode 100644 src/app/routes/usercenter/components/freight/user/new/new.component.ts create mode 100644 src/app/routes/usercenter/components/freight/user/user.component.html create mode 100644 src/app/routes/usercenter/components/freight/user/user.component.spec.ts create mode 100644 src/app/routes/usercenter/components/freight/user/user.component.ts create mode 100644 src/app/routes/usercenter/components/freight/user/view/view.component.html create mode 100644 src/app/routes/usercenter/components/freight/user/view/view.component.less create mode 100644 src/app/routes/usercenter/components/freight/user/view/view.component.spec.ts create mode 100644 src/app/routes/usercenter/components/freight/user/view/view.component.ts diff --git a/src/app/routes/usercenter/components/freight/user/detail/detail.component.html b/src/app/routes/usercenter/components/freight/user/detail/detail.component.html new file mode 100644 index 00000000..4aafe892 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/user/detail/detail.component.html @@ -0,0 +1,289 @@ + + + + + + + + + + + + +
+ + + +
确定冻结该企业吗?
+
+ 停用后,该企业将被限制使用,不限于访问受限、无法发布货源等,请谨慎操作 +
+
+
+ +
+ + + +
确定启用该企业吗?
+
+ 启用后,该企业将恢复正常使用功能,请再次确认 +
+
+
+ +
+ + + +
确定关闭该企业支付权限吗?
+
+ 停用后,该企业将被限制使用支付功能,请谨慎操作 +
+
+
+ +
+ + + +
确定开通该企业支付权限吗?
+
+ 启用后,该企业将恢复正常支付功能,请再次确认 +
+
+
+
+ + + 联系信息人 + + {{ detailData?.contactsName }} + + + {{ detailData?.contactsPhone }} + + + {{ detailData?.contactsPhone }} + + + + + + + + 公司基本信息 + + {{ detailData?.enterpriseName }} + + + {{ detailData?.unifiedSocialCreditCode }} + + + {{ detailData?.enterpriseType }} + + + {{ detailData?.registrationCapital }} + 万元 + + + {{ detailData?.enterpriseRegistrationTime }} + + +
+ {{ detailData?.operatingStartTime }} 至 {{ detailData?.operatingEndTime }} +
+
长期
+
{{ detailData?.operatingStartTime }} 至 长期
+
+
+ + + {{ detailData?.enterpriseAddressCodeStr }} + + + {{ detailData?.enterpriseAddress }} + + + + + {{ detailData?.enterpriseAddressCodeStr }} + + + {{ detailData?.enterpriseAddress }} + + + + + {{ detailData?.enterpriseAddressCodeStr }} + + + {{ detailData?.enterpriseAddress }} + + + + + {{ detailData?.businessScope }} + + + + + + + + 法人信息 + + {{ detailData?.name }} + + + {{ detailData?.certificateNumber }} + + + {{ detailData?.validStartTime }} - + {{ detailData?.validEndTime ? detailData?.validEndTime : '长期' }} + + + + + + + + 银行结算信息 + + {{ detailData?.name }} + + + {{ detailData?.certificateNumber }} + + + {{ detailData?.validStartTime }} + + +
+
+ + +
+ + +
+
diff --git a/src/app/routes/usercenter/components/freight/user/detail/detail.component.less b/src/app/routes/usercenter/components/freight/user/detail/detail.component.less new file mode 100644 index 00000000..48f605d9 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/user/detail/detail.component.less @@ -0,0 +1,46 @@ +@import '~@delon/theme/index'; +:host { + ::ng-deep { + .ant-steps-dot { + .ant-steps-item-content { + width: 200px; + } + .ant-steps-item-icon { + margin-left: 96px; + } + .ant-steps-item-tail::after { + margin-left: 40px; + } + } + .success { + color: @success-color; + } + + .warning { + color: @warning-color; + } + + .error { + color: @error-color; + } + } + .mt16 { + margin-top: 16px; + } + .user-info { + display: flex; + font-size: 16px; + .enterprise-name { + margin-right: 15px; + } + img { + width: 64px; + height: 64px; + margin-right: 15px; + border-radius: 50%; + } + .user-info-des { + margin-bottom: 5px; + } + } +} diff --git a/src/app/routes/usercenter/components/freight/user/detail/detail.component.spec.ts b/src/app/routes/usercenter/components/freight/user/detail/detail.component.spec.ts new file mode 100644 index 00000000..00666a0b --- /dev/null +++ b/src/app/routes/usercenter/components/freight/user/detail/detail.component.spec.ts @@ -0,0 +1,31 @@ +/* + * @Author: your name + * @Date: 2021-11-29 20:19:08 + * @LastEditTime: 2021-11-29 20:31:00 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\usercenter\components\freight\list\detail\detail.component.spec.ts + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { FreightComponentsListDetailComponent } from './detail.component'; + +describe('FreightComponentsListDetailComponent', () => { + let component: FreightComponentsListDetailComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FreightComponentsListDetailComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FreightComponentsListDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/usercenter/components/freight/user/detail/detail.component.ts b/src/app/routes/usercenter/components/freight/user/detail/detail.component.ts new file mode 100644 index 00000000..809f567f --- /dev/null +++ b/src/app/routes/usercenter/components/freight/user/detail/detail.component.ts @@ -0,0 +1,255 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { UsermanageService } from '../../../../services/usercenter.service'; + +@Component({ + selector: 'app-supplier-components-list-view', + templateUrl: './detail.component.html', + styleUrls: ['./detail.component.less'], +}) +export class FreightComponentsListDetailComponent implements OnInit { + i: any; + url = `/rule?_allow_anonymous=true`; + @ViewChild('st', { static: false }) st!: STComponent; + detailData: any; + isShow = false; + isVisible = false; + modalTitle = '有效期'; + modalName = ''; + ui!: SFUISchema; + schema!: SFSchema; + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema1!: SFSchema; + @ViewChild('sf1', { static: false }) sf1!: SFComponent; + validData: any = ['suppliersType']; + suppliersData: any = {}; + + constructor( + private http: _HttpClient, + private modal: ModalHelper, + public service: UsermanageService, + private route: ActivatedRoute, + private modalHelper: ModalHelper, + private msgSrv: NzMessageService, + ) {} + + ngOnInit() { + console.log(this.route.snapshot); + // this.initData(); + this.initSF(); + this.initSF1(); + // this.launchSign(); + } + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + effectiveDate: { + title: '有效期', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd 00:00:00', + // hidden: this.modalName === 'effectiveDate' ? false : true, + } as SFDateWidgetSchema, + }, + }, + required: ['effectiveDate'], + }; + this.ui = { '*': { spanLabelFixed: 120, grid: { span: 24 } } }; + } + initSF1() { + this.schema1 = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + suppliersType: { + type: 'string', + title: '类型', + enum: [ + { label: '非外部供应商', value: 0 }, + { label: '外部供应商', value: 1 }, + ], + default: '', + ui: { + widget: 'select', + change: (args: any) => { + console.log(args, 'args'); + this.suppliersData.suppliersType = args; + if (args === 1) { + this.validData = ['suppliersType', 'externalSuppliersId']; + } else { + this.validData = ['suppliersType']; + this.suppliersData.externalSuppliersId = ''; + } + this.initSF1(); + }, + }, + }, + externalSuppliersId: { + title: '外部供应商id', + type: 'string', + default: '', + ui: { + visibleIf: { suppliersType: (value: any) => value === 1 }, + }, + }, + }, + required: this.validData, + }; + } + showModal(name: any) { + this.modalName = name; + if (name === 'effectiveDate') { + this.isShow = true; + } else { + this.isVisible = true; + } + } + async initData() { + console.log(this.route.snapshot, 'this.route.snapshot'); + + const params = { + tenantId: this.route.snapshot.params.id, + // tenantId: this.route.snapshot.queryParams.tenantId, + }; + const res = await this.service.asyncRequest(this.service.$api_get_supplier_info, params); + // // 商品资质 + // if (res.enterpriseBusinessJson) { + // res.enterpriseBusinessJson.aptitudes = res.enterpriseBusinessJson?.aptitudes ? res.enterpriseBusinessJson.aptitudes.split(',') : []; + // } + // // // 申请人身份证证件 + // // res.applyUserJson.imagelist = []; + // // res.applyUserJson.imagelist.push(res.applyUserJson.certificatePhotoFront); + // // res.applyUserJson.imagelist.push(res.applyUserJson.certificatePhotoBack); + // // res.applyUserJson.imagelist.push(res.applyUserJson.handCertificate); + + // 法人身份证证件 + const imagelist = []; + imagelist.push(res?.certificatePhotoFront); + imagelist.push(res?.certificatePhotoBack); + res.certificatePhoto = imagelist; + + // 营业执照 + res.enterpriseQualificationCertificate = res.enterpriseQualificationCertificate + ? res.enterpriseQualificationCertificate.split(',') + : []; + + // 返回所在地 + res.enterpriseAddressCodeStr = await this.getRegionFullName(res.enterpriseAddressCode); + + this.detailData = res; + this.suppliersData = { + suppliersType: res?.suppliersType, + externalSuppliersId: res?.externalSuppliersId, + }; + } + + /** + * 根据地区code查询地区详情 + * @param code 地区代码 + */ + async getRegionFullName(code: any) { + const params = { + regionCode: code, + }; + const res = await this.service.asyncRequest(this.service.$api_get_region_detailByCode, params, 'POST', true); + // if (res && res.regionFullName) { + // const arr = res.regionFullName.split(','); + // res.regionFullName = arr.reverse().join('-'); + // } + return res && res.regionFullName; + } + add() { + // this.modal + // .createStatic(FormEditComponent, { i: { id: 0 } }) + // .subscribe(() => this.st.reload()); + } + goBack() { + window.history.go(-1); + } + /** + * 冻结 + */ + freezeOrResume(type: number) { + console.log(type) + // this.service.http + // .post(this.service.$api_set_freezeOrResume, { + // tenantId: this.route.snapshot.params.id, + // // tenantId: this.route.snapshot.queryParams.tenantId, + // status: type, + // }) + // .subscribe((res) => { + // if (res.data === true) { + // if (type === 0) { + // this.service.msgSrv.success(`启用成功!`); + // } else if (type === 1) { + // this.service.msgSrv.success(`冻结成功!`); + // } + // this.ngOnInit(); + // } else { + // this.service.msgSrv.error(res.msg || '操作失败!'); + // } + // }); + } + PayOrResume(type: number) { + console.log(type) + // this.service.http + // .post(this.service.$api_set_freezeOrResume, { + // tenantId: this.route.snapshot.params.id, + // // tenantId: this.route.snapshot.queryParams.tenantId, + // status: type, + // }) + // .subscribe((res) => { + // if (res.data === true) { + // if (type === 0) { + // this.service.msgSrv.success(`启用成功!`); + // } else if (type === 1) { + // this.service.msgSrv.success(`冻结成功!`); + // } + // this.ngOnInit(); + // } else { + // this.service.msgSrv.error(res.msg || '操作失败!'); + // } + // }); + } + + handleCancel(name: any) { + if (name === 'effectiveDate') { + this.isShow = false; + } else { + this.isVisible = false; + } + } + handleOK(name: any) { + const params: any = { + tenantId: this.route.snapshot.params.id, + // tenantId: this.route.snapshot.queryParams.tenantId, + }; + + if (name === 'effectiveDate') { + params.effectiveDate = this.sf?.value?.effectiveDate; + } else { + Object.assign(params, this.sf1?.value); + } + this.service.http.post(this.service.$api_set_freezeOrResume, params).subscribe((res) => { + if (res.data === true) { + this.service.msgSrv.success(`编辑成功!`); + this.ngOnInit(); + } else { + this.service.msgSrv.error(res.msg || '编辑失败!'); + } + if (name === 'effectiveDate') { + this.isShow = false; + } else { + this.isVisible = false; + } + }); + } +} diff --git a/src/app/routes/usercenter/components/freight/user/new/new.component.html b/src/app/routes/usercenter/components/freight/user/new/new.component.html new file mode 100644 index 00000000..fe0400fa --- /dev/null +++ b/src/app/routes/usercenter/components/freight/user/new/new.component.html @@ -0,0 +1,109 @@ + + + + + +
营业执照基本信息
+
+ +
营业执照法人信息
+
+ +
+ 请上传营业执照原件的高清照片,若上传复印件,则需加盖公司印章; +
上传后系统会自动识别并填写
+
+
+ +
万元
+
+ + +
+
请上传身份证原件的高清照片,若上传复印件,则需申请人签字;
+
上传后系统会自动识别并填写
+
+
+ +
+
+
正面照(人像面)
+
示例
+
+
+
+
+ +
+
+
背面照(国徽面)
+
示例
+
+
+
+
+ +
+ + +
公司其他补充信息
+
+ +
企业管理员信息
+
+ + +
+
请上传该企业授权您成为本系统企业管理员的文件的高清照片,需加盖公司印章
+
上传后系统会自动识别并填写
+
+
+
+ +
+
+
+
示例
+
+
+
+
+ +
+
{{ telephone }} 默认当前登录账号绑定的手机号
+
+
+ +
+
请上传身份证原件的高清照片,若上传复印件,则需申请人签字;
+
上传后系统会自动识别并填写
+
+
+ +
+
+
正面照(人像面)
+
示例
+
+
+
+
+ +
+
+
背面照(国徽面)
+
示例
+
+
+
+
+ +
+ + +
+ + +
+
+
diff --git a/src/app/routes/usercenter/components/freight/user/new/new.component.less b/src/app/routes/usercenter/components/freight/user/new/new.component.less new file mode 100644 index 00000000..55bf514e --- /dev/null +++ b/src/app/routes/usercenter/components/freight/user/new/new.component.less @@ -0,0 +1,109 @@ +:host { + ::ng-deep { + nz-card { + .page-title { + margin-bottom: 39px; + color : #333; + font-weight : 500; + font-size : 20px; + line-height : 28px; + text-align : center; + } + + .step-title { + display: block; + width : 800px !important; + margin : 0 auto; + } + + .myForm { + width : 680px; + margin: 5rem auto; + } + + .steps-content { + min-height: 250px; + } + + .btn-submit { + margin-top: 16px; + } + + .pr { + position: relative; + } + + .pa { + position: absolute; + top : 35px; + left : 150px; + } + + .tips { + display : flex; + margin-bottom: 0; + color : #333; + + dt { + width: 150px; + } + + dd { + width : 190px; + margin-bottom: 0; + text-align : center; + } + } + + .form-title { + margin-bottom: 10px; + padding-left : 8px; + color : #333; + font-weight : 700; + font-size : 18px; + line-height : 20px; + border-left : solid 3px #1890ff; + } + + .form-content { + padding: 48px 32px; + } + + .apply-sv { + margin : 16px 0; + padding : 20px; + background : #f8f8f8; + border-radius: 2px; + } + + .result-date { + font-size: 12px; + } + + .result-tips { + color : #ff4d4f; + font-size: 14px; + } + + .sv-img { + display : inline-block; + width : 104px; + height : 104px; + margin-right : 20px; + padding : 8px; + background : #fff; + border : 1px solid rgba(0, 0, 0, 0.15); + border-radius: 2px; + + img { + width : 100%; + height: 100%; + } + } + } + + .ant-row { + margin-left: 100px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/user/new/new.component.ts b/src/app/routes/usercenter/components/freight/user/new/new.component.ts new file mode 100644 index 00000000..df20847f --- /dev/null +++ b/src/app/routes/usercenter/components/freight/user/new/new.component.ts @@ -0,0 +1,1400 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { apiConf } from '@conf/api.conf'; +import { + SFCascaderWidgetSchema, + SFCheckboxWidgetSchema, + SFComponent, + SFDateWidgetSchema, + SFSchema, + SFSchemaEnum, + SFSelectWidgetSchema, + SFTextareaWidgetSchema, + SFUISchema, + SFUploadWidgetSchema, +} from '@delon/form'; +import { ModalHelper } from '@delon/theme'; +import { EnvironmentService } from '@env/environment.service'; +import { NzCascaderOption } from 'ng-zorro-antd/cascader'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +// import { AccountService } from '../../services/account.service'; +// import { AccountComponentsImgViewComponent } from '../img-view/img-view.component'; + +@Component({ + selector: 'app-account-components-freight-new', + templateUrl: './new.component.html', + styleUrls: ['./new.component.less'], +}) +export class FreightComponentsListNewComponent implements OnInit { + url = `/rule?_allow_anonymous=true`; + + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('sf1', { static: false }) + sf1!: SFComponent; + // @ViewChild('sf2', { static: false }) + // sf2!: SFComponent; + // @ViewChild('sf3', { static: false }) + // sf3!: SFComponent; + telephone = ''; + record: any = {}; + i: any; + schema!: SFSchema; + schema1!: SFSchema; + // schema2!: SFSchema; + // schema3!: SFSchema; + ui!: SFUISchema; + + id!: string; + isEdit!: boolean; + subStep = 0; + infoData: any = {}; + infoData1: any = {}; + infoData2: any = { + accountName: '', + }; + infoData3: any = {}; + branchBankName = ''; + bankArea = ''; + bankName = ''; + bankLogoUrl = ''; + bankRegion: any[] = []; + branchBanks: any[] = []; + signingPeriod = 2; + pdfSrc: any; + result = true; + enterpriseAddressCodeStr = ''; + enterpriseAddressCode: any; + enterpriseBusinessAddressCodeStr = ''; + enterpriseBusinessAddressCode = ''; + taxpayerTypeStr = ''; + regionData: any = []; + aptitudes: any = []; + constructor( + private routerinfo: ActivatedRoute, + public msg: NzMessageService, + private router: Router, + private modalService: NzModalService, + private modal: ModalHelper, + ) {} + ngOnInit() { + this.id = this.routerinfo.snapshot.queryParams.id; + + if (this.routerinfo.snapshot.queryParams.id) { + this.isEdit = true; + this.getApplicationInfo(this.routerinfo.snapshot.queryParams.id); + } else { + this.getUserDetail(); + } + this.initSF(); + } + initSF() { + this.schema = { + properties: { + title1: { + title: '', + type: 'string', + ui: { + widget: 'custom', + }, + }, + + // tipsE: { + // title: '', + // type: 'string', + // ui: { + // widget: 'custom', + // offsetControl: 6, + // }, + // }, + tipsD: { + title: '企业授权函', + type: 'string', + ui: { + widget: 'custom', + }, + }, + tipsE: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + certificatePhotoFront2: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.fileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: this.envSrv.getEnvironment().appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + this.checkIdCard(args.fileList[0].response.url, 0, 1); + } + }, + } as SFUploadWidgetSchema, + }, + region2: { + type: 'number', + title: '常用服务', + enum: this.regionData, + // default: [110000, 110100, 110105], + ui: { + width: 700, + widget: 'cascader', + valueProperty: 'regionCode', + labelProperty: 'name', + change: (ngModel: string | any[]) => { + const len = ngModel.length - 1; + this.enterpriseAddressCode = ngModel[len]; + // this.getRegionDetailByCode(ngModel[len],'name', 1); // 获取省市区名称 + }, + selectionChange: (values: NzCascaderOption[]) => { + // 获取省市区名称 + const len = values.length - 1; + this.enterpriseAddressCodeStr = values[len].regionFullName.split(',').reverse().join(''); + }, + }, + }, + contactsName: { + title: '推广业务员手机号', + type: 'string', + minLength: 1, + maxLength: 32, + ui: { + width: 700, + placeholder: '请输入您的真实姓名', + errors: { + required: '请输入您的真实姓名', + }, + }, + }, + title99: { + title: '', + type: 'string', + ui: { + widget: 'custom', + }, + }, + tipsA: { + title: '企业管理员证件照', + type: 'string', + ui: { + widget: 'custom', + }, + }, + certificatePhotoFront: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.fileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: this.envSrv.getEnvironment().appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + this.checkIdCard(args.fileList[0].response.url, 0, 1); + } + }, + } as SFUploadWidgetSchema, + }, + tipsB: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + certificatePhotoBack: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.fileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: this.envSrv.getEnvironment().appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + this.checkIdCard(args.fileList[0].response.url, 1, 1); + } + }, + } as SFUploadWidgetSchema, + }, + name: { + title: '企业管理员姓名', + type: 'string', + maxLength: 8, + ui: { + width: 700, + placeholder: '请输入营业执照上的企业管理员姓名', + }, + }, + certificateNumber: { + title: '企业管理员身份证号', + type: 'string', + format: 'id-card', + minLength: 1, + maxLength: 18, + ui: { + width: 700, + placeholder: '请输入法定代表人身份证号码', + }, + }, + telephone: { + title: '企业管理员手机号', + type: 'string', + maxLength: 11, + format: 'mobile', + ui: { + placeholder: '请输入企业管理员手机号', + }, + }, + }, + required: ['contactsName'], + }; + this.schema1 = { + properties: { + title1: { + title: '', + type: 'string', + ui: { + widget: 'custom', + }, + }, + tips: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + enterpriseQualificationCertificate: { + type: 'string', + title: '营业执照', + ui: { + action: apiConf.fileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: this.envSrv.getEnvironment().appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + this.checkBusinessLicense(args.fileList[0].response.url); + } + }, + } as SFUploadWidgetSchema, + }, + unifiedSocialCreditCode: { + title: '统一社会信用代码', + type: 'string', + minLength: 1, + maxLength: 18, + ui: { + width: 700, + optionalHelp: + '为了企业用户的使用体验,若公司代码即统一社会信用代码已在本应用其他关联平台注册,则此处填写的公司资料将同步更新至对应已注册的平台', + placeholder: '请输入营业执照上的统一社会信用代码', + errors: { + required: '请输入18位公司代码', + }, + }, + }, + enterpriseName: { + title: '公司名称', + type: 'string', + minLength: 2, + maxLength: 100, + ui: { + width: 700, + placeholder: '请输入公司名称', + errors: { + required: '请输入公司名称', + }, + }, + }, + enterpriseType: { + title: '公司类型', + type: 'string', + minLength: 1, + maxLength: 30, + ui: { + width: 700, + placeholder: '请输入公司类型', + errors: { + required: '请输入公司类型', + }, + }, + }, + region: { + type: 'number', + title: '营业执照所在地', + enum: this.regionData, + // default: [110000, 110100, 110105], + ui: { + width: 700, + widget: 'cascader', + valueProperty: 'regionCode', + labelProperty: 'name', + change: (ngModel: string | any[]) => { + const len = ngModel.length - 1; + this.enterpriseAddressCode = ngModel[len]; + // this.getRegionDetailByCode(ngModel[len],'name', 1); // 获取省市区名称 + }, + selectionChange: (values: NzCascaderOption[]) => { + // 获取省市区名称 + const len = values.length - 1; + this.enterpriseAddressCodeStr = values[len].regionFullName.split(',').reverse().join(''); + }, + }, + }, + enterpriseAddress: { + title: '营业执照详细地址', + type: 'string', + minLength: 1, + maxLength: 240, + ui: { + width: 700, + widget: 'textarea', + autosize: { minRows: 2, maxRows: 5 }, + placeholder: '请输入营业执照上的完整详细地址', + errors: { + required: '请输入营业执照上的完整详细地址', + }, + } as SFTextareaWidgetSchema, + }, + + title2: { + title: '', + type: 'string', + ui: { + widget: 'custom', + }, + }, + tipsC: { + title: '法定代表人证件照', + type: 'string', + ui: { + widget: 'custom', + // offsetControl: 6, + }, + }, + tipsA: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + certificatePhotoFront: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.fileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: this.envSrv.getEnvironment().appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + this.checkIdCard(args.fileList[0].response.url, 0, 1); + } + }, + } as SFUploadWidgetSchema, + }, + tipsB: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + certificatePhotoBack: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.fileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: this.envSrv.getEnvironment().appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + this.checkIdCard(args.fileList[0].response.url, 1, 1); + } + }, + } as SFUploadWidgetSchema, + }, + name: { + title: '法人姓名', + type: 'string', + maxLength: 8, + ui: { + width: 700, + placeholder: '请输入营业执照上的法人姓名', + }, + }, + region2: { + type: 'number', + title: '法人证件类型', + enum: this.regionData, + // default: [110000, 110100, 110105], + ui: { + width: 700, + widget: 'cascader', + valueProperty: 'regionCode', + labelProperty: 'name', + change: (ngModel: string | any[]) => { + const len = ngModel.length - 1; + this.enterpriseAddressCode = ngModel[len]; + // this.getRegionDetailByCode(ngModel[len],'name', 1); // 获取省市区名称 + }, + selectionChange: (values: NzCascaderOption[]) => { + // 获取省市区名称 + const len = values.length - 1; + this.enterpriseAddressCodeStr = values[len].regionFullName.split(',').reverse().join(''); + }, + }, + }, + certificateNumber: { + title: '法定代表人身份证号码', + type: 'string', + format: 'id-card', + minLength: 1, + maxLength: 18, + ui: { + width: 700, + placeholder: '请输入法定代表人身份证号码', + }, + }, + validStartTime: { + title: '身份证有效开始日期', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择', + errors: { + required: '请选择开始日期', + }, + change: (i) => { + // this.sf1?.setValue('/dateType1', false); + }, + } as SFDateWidgetSchema, + }, + validEndTime: { + title: '身份证有效截止日期', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择', + errors: { + required: '请选择截止日期', + }, + change: (i) => { + this.sf1?.setValue('/dateType1', false); + }, + } as SFDateWidgetSchema, + }, + dateType1: { + title: '长期', + type: 'boolean', + // enum: [{ label: '长期', value: true }], + ui: { + widget: 'checkbox', + change: (i) => this.longTime(i, 'schema11'), + } as SFCheckboxWidgetSchema, + }, + }, + required: [ + 'enterpriseQualificationCertificate', + 'unifiedSocialCreditCode', + 'enterpriseName', + 'enterpriseType', + 'region', + 'enterpriseAddress', + 'registrationCapital', + 'enterpriseRegistrationTime', + 'operatingEndTime', + 'operatingStartTime', + 'dateType', + 'businessScope', + 'certificatePhotoFront', + 'certificatePhotoBack', + 'name', + 'certificateNumber', + 'validStartTime', + 'validEndTime', + 'dateType1', + ], + }; + + this.ui = { + '*': { + spanLabelFixed: 180, + grid: { span: 24 }, + }, + $title1: { + spanLabelFixed: 0, + }, + $title99: { + spanLabelFixed: 0, + }, + $title2: { + spanLabelFixed: 0, + }, + $title3: { + spanLabelFixed: 0, + }, + $registrationCapital: { + spanLabelFixed: 180, + grid: { span: 11 }, + }, + $unit: { + spanLabelFixed: 100, + grid: { span: 6 }, + }, + }; + } + submitForm() { + + } + // submitForm() { + // // 营业执照基本信息 + // if (!this.sf.value.contactsName) { + // // this.service.msgSrv.warning('请填写申请人姓名'); + // return; + // } + // if (!this.sf1.value.enterpriseQualificationCertificate) { + // // this.service.msgSrv.warning('请上传营业执照'); + // return; + // } + // if (!this.sf1.value.unifiedSocialCreditCode) { + // // this.service.msgSrv.warning('请填写统一社会信用代码'); + // return; + // } + // if (!this.sf1.value.enterpriseName) { + // // this.service.msgSrv.warning('请填写公司名称'); + // return; + // } + // if (!this.sf1.value.enterpriseType) { + // // this.service.msgSrv.warning('请填写公司类型'); + // return; + // } + // if (!this.sf1.value.region) { + // // this.service.msgSrv.warning('请选择所在地区'); + // return; + // } + // if (!this.sf1.value.enterpriseAddress) { + // // this.service.msgSrv.warning('请填写营业执照详细地址'); + // return; + // } + // if (!this.sf1.value.registrationCapital) { + // // this.service.msgSrv.warning('请填写注册资本'); + // return; + // } + // if (!this.sf1.value.enterpriseRegistrationTime) { + // // this.service.msgSrv.warning('请选择成立日期'); + // return; + // } + // if (!this.sf1.value.operatingStartTime) { + // // this.service.msgSrv.warning('请选择营业期限开始日期'); + // return; + // } + // if (this.sf1.value.dateType !== true) { + // if (!this.sf1.value.operatingEndTime) { + // this.service.msgSrv.warning('请选择营业期限结束日期'); + // return; + // } + // if (this.sf1.value.operatingEndTime <= this.sf1.value.operatingStartTime) { + // this.service.msgSrv.warning('营业期限结束日期不能小于或等于开始日期'); + // return; + // } + // } + // if (!this.sf1.value.businessScope) { + // this.service.msgSrv.warning('请填写经营范围'); + // return; + // } + // if (!this.sf1.value.certificatePhotoFront) { + // this.service.msgSrv.warning('请上传身份证正面照'); + // return; + // } + // if (!this.sf1.value.certificatePhotoBack) { + // this.service.msgSrv.warning('请上传身份证反面照'); + // return; + // } + // if (!this.sf1.value.name) { + // this.service.msgSrv.warning('请填写法定代表人'); + // return; + // } + // if (!this.sf1.value.certificateNumber) { + // this.service.msgSrv.warning('请填写法定代表人身份证号'); + // return; + // } + // if (!this.sf1.value.validStartTime) { + // this.service.msgSrv.warning('请选择身份证有效开始日期'); + // return; + // } + // if (this.sf1.value.dateType1 !== true) { + // if (!this.sf1.value.validEndTime) { + // this.service.msgSrv.warning('请选择身份证有效截止日期'); + // return; + // } + // if (this.sf1.value.validEndTime <= this.sf1.value.validStartTime) { + // this.service.msgSrv.warning('身份证有效截止日期不能小于或等于开始日期'); + // return; + // } + // } + // const params: any = { + // contactsName: this.sf.value.contactsName, + // contactsPhone: this.sf.value.telephone, + // certificateNumber: this.sf1.value.certificateNumber, + // unifiedSocialCreditCode: this.sf1.value.unifiedSocialCreditCode, + // enterpriseAddressCodeStr: this.sf1.value.enterpriseAddressCodeStr, + // enterpriseAddressCode: this.sf1.value.region[2], + // enterpriseAddress: this.sf1.value.enterpriseAddress, + // enterpriseName: this.sf1.value.enterpriseName, + // enterpriseNameAbbreviation: this.sf1.value.enterpriseNameAbbreviation, + // enterpriseQualificationCertificate: this.sf1.value.enterpriseQualificationCertificate, + // enterpriseType: this.sf1.value.enterpriseType, + // enterpriseTelephone: this.sf1.value.enterpriseTelephone, + // enterpriseRegistrationTime: this.sf1.value.enterpriseRegistrationTime, + // businessScope: this.sf1.value.businessScope, + // operatingEndTime: this.sf1.value.operatingEndTime, + // operatingStartTime: this.sf1.value.operatingStartTime, + // organizationCode: this.sf1.value.organizationCode, + // registrationCapital: this.sf1.value.registrationCapital, + + // legalPersonIdentity: { + // // ...this.sf1.value, + // validStartTime: this.sf1.value.validStartTime, + // validEndTime: this.sf1.value.validEndTime, + // certificatePhotoBack: this.sf1.value.certificatePhotoBack, + // certificateNumber: this.sf1.value.certificateNumber, + // certificatePhotoFront: this.sf1.value.certificatePhotoFront, + // certificateType: this.sf1.value.certificateType, + // handCertificate: this.sf1.value.handCertificate, + // name: this.sf1.value.name, + // }, + // }; + // if (this.routerinfo.snapshot.queryParams.id) { + // params.id = this.routerinfo.snapshot.queryParams.id; + // } + // delete params?.tips; + // this.service.http.post(this.service.$api_supplierSubmitInfo, params).subscribe((res) => { + // if (res) { + // this.getApplicationInfo(res.data?.id); + // } + // }); + // } + getUserDetail() { + // this.service.http.post(this.service.$api_get_current_user_detail).subscribe((res) => { + // if (res) { + // this.infoData.telephone = res.data.phone; + // this.initSF(); + // } + // }); + } + + viewImg(image: any) { + // this.modal.createStatic(AccountComponentsImgViewComponent, { i: { imgUrl: image } }).subscribe(() => { + // // this.st.reload(); + // }); + } + getRegionToThree() { + // 获取一、二、三级地区详情 + // this.service.http.post(this.service.$api_getRegionToThree).subscribe((res) => { + // this.regionData = res.data; + // this.initSF(); + // }); + } + getApplicationInfo(id: string) { + // 查询申请信息详情 + const params: any = { + id, + }; + // this.service.http.post(this.service.$api_getSupplierEntryDetailInfo, params).subscribe((res) => { + // this.infoData.updateTime = res.data.updateTime; + // this.infoData.auditStatus = res.data.auditStatus; + // this.infoData.auditOpinion = res.data.auditOpinion; + // this.infoData1.contactsName = res.data.contactsName; + // this.infoData1.operationUserPhone = res.data.contactsPhone; + // this.infoData1.enterpriseName = res.data.enterpriseName; + // this.infoData1.unifiedSocialCreditCode = res.data.unifiedSocialCreditCode; + // this.infoData1.enterpriseType = res.data.enterpriseType; + // this.infoData1.registrationCapital = res.data.registrationCapital; + // this.infoData1.enterpriseRegistrationTime = res.data.operatingStartTime; + // this.infoData1.enterpriseRegistrationTime = res.data.operatingStartTime; + // this.infoData1.operatingStartTime = res.data.operatingStartTime; + // this.infoData1.operatingEndTime = res.data.operatingEndTime; + // this.infoData1.operatingEndTime = res.data.operatingEndTime; + // this.enterpriseAddressCodeStr = res.data.enterpriseAddressCodeStr; + // this.infoData1.enterpriseAddress = res.data.enterpriseAddress; + // this.infoData1.enterpriseBusinessAddress = res.data.enterpriseAddress; + // this.infoData1.businessScope = res.data.businessScope; + // this.infoData1.name = res.data.name; + // this.infoData1.certificateNumber = res.data.certificateNumber; + // this.infoData1.validStartTime = res.data.validStartTime; + // this.infoData1.validEndTime = res.data.validEndTime; + // this.infoData1.certificatePhotoFront = res.data.certificatePhotoFront; + // this.infoData1.enterpriseQualificationCertificate = res.data.enterpriseQualificationCertificate; + // this.infoData1.certificatePhotoBackurl = res.data.certificatePhotoBack; + // this.infoData1.certificatePhotoFronturl = res.data.certificatePhotoFront; + // this.infoData1.enterpriseQualificationCertificateurl = res.data.enterpriseQualificationCertificate; + + // this.infoData1.certificatePhotoBack = res.data.certificatePhotoBack; + // this.signingPeriod = res.data.signingPeriod; + // if (res.data) { + // // 申请人信息 + // this.infoData.certificatePhotoBack = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoBack, + // response: { + // url: res.data.certificatePhotoBack, + // }, + // }, + // ]; + // this.infoData.certificatePhotoFront = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoFront, + // response: { + // url: res.data.certificatePhotoFront, + // }, + // }, + // ]; + // if (!res.data.validEndTime) { + // this.infoData1.dateType1 = true; + // // this.sf.getProperty('/validStartTime').schema.readOnly = true; + // // this.sf.getProperty('/validEndTime').schema.readOnly = true; + // } + // } + // if (res.data) { + // // 营业执照基本信息 + // this.infoData1.enterpriseQualificationCertificate = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.enterpriseQualificationCertificate, + // response: { + // url: res.data.enterpriseQualificationCertificate, + // }, + // }, + // ]; + // this.infoData1.certificatePhotoFront = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoFront, + // response: { + // url: res.data.certificatePhotoFront, + // }, + // }, + // ]; + // this.infoData1.certificatePhotoBack = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoBack, + // response: { + // url: res.data.certificatePhotoBack, + // }, + // }, + // ]; + // this.infoData1.unifiedSocialCreditCode = res.data.unifiedSocialCreditCode; + // this.infoData1.enterpriseName = res.data.enterpriseName; + // this.infoData1.enterpriseType = res.data.enterpriseType; + // this.infoData1.enterpriseAddress = res.data.enterpriseAddress; + // // this.infoData1.enterpriseAddressCodeStr = res.data.businessLicenseJson.enterpriseAddressCodeStr; + // // this.infoData1.enterpriseBusinessAddressCodeStr = res.data.businessLicenseJson.enterpriseBusinessAddressCodeStr; + // this.infoData1.registrationCapital = res.data.registrationCapital; + // this.infoData1.enterpriseRegistrationTime = res.data.enterpriseRegistrationTime; + // this.infoData1.operatingStartTime = res.data.operatingStartTime; + // this.infoData1.operatingEndTime = res.data.operatingEndTime; + // this.infoData1.businessScope = res.data.businessScope; + // this.enterpriseAddressCodeStr = res.data.enterpriseAddressCodeStr; + // this.enterpriseAddressCode = +res.data.enterpriseAddressCode; + // this.getRegionDetailByCode(res.data.enterpriseAddressCode); + + // this.enterpriseBusinessAddressCodeStr = res.data.enterpriseBusinessAddressCodeStr; + // this.enterpriseBusinessAddressCode = res.data.enterpriseBusinessAddressCode; + // if (!res.data.operatingEndTime) { + // this.infoData1.dateType = true; + // } + // this.infoData.contactsName = res.data.contactsName; + // this.infoData.telephone = res.data.contactsPhone; + // } + + // if (res.data.auditStatus === 0 || res.data.auditStatus === 2 || res.data.auditStatus === 3) { + // // 1:待审核,2:复审,3:终审,5:已驳回 + // } else if (res.data.auditStatus === 1) { + // // 4:待签约 + // // this.getPdf(); + // // this.getEnterpriseInfo(this.id); + // } else if (res.data.auditStatus === 4) { + // // 6:已终止,7:已成功 + // this.step = 3; + // } + // this.initSF(); + // }); + } + getApplicationInfo2(id: string) { + // 查询申请信息详情 + const params: any = { + id, + }; + // this.service.http.post(this.service.$api_getSupplierEntryDetailInfo, params).subscribe((res) => { + // this.infoData.updateTime = res.data.updateTime; + // this.infoData.auditStatus = res.data.auditStatus; + // this.infoData.auditOpinion = res.data.auditOpinion; + // this.infoData1.contactsName = res.data.contactsName; + // this.infoData1.enterpriseName = res.data.enterpriseName; + // this.infoData1.unifiedSocialCreditCode = res.data.unifiedSocialCreditCode; + // this.infoData1.enterpriseType = res.data.enterpriseType; + // this.infoData1.registrationCapital = res.data.registrationCapital; + // this.infoData1.enterpriseRegistrationTime = res.data.operatingStartTime; + // this.infoData1.enterpriseRegistrationTime = res.data.operatingStartTime; + // this.infoData1.operatingStartTime = res.data.operatingStartTime; + // this.infoData1.operatingEndTime = res.data.operatingEndTime; + // this.infoData1.operatingEndTime = res.data.operatingEndTime; + // this.enterpriseAddressCodeStr = res.data.enterpriseAddressCodeStr; + // this.infoData1.enterpriseAddress = res.data.enterpriseAddress; + // this.infoData1.enterpriseBusinessAddress = res.data.enterpriseAddress; + // this.infoData1.businessScope = res.data.businessScope; + // this.infoData1.name = res.data.name; + // this.infoData1.certificateNumber = res.data.certificateNumber; + // this.infoData1.validStartTime = res.data.validStartTime; + // this.infoData1.validEndTime = res.data.validEndTime; + // this.infoData1.certificatePhotoFront = res.data.certificatePhotoFront; + // this.infoData1.enterpriseQualificationCertificate = res.data.enterpriseQualificationCertificate; + // this.infoData1.certificatePhotoBackurl = res.data.certificatePhotoBack; + // this.infoData1.certificatePhotoFronturl = res.data.certificatePhotoFront; + // this.infoData1.enterpriseQualificationCertificateurl = res.data.enterpriseQualificationCertificate; + + // this.infoData1.certificatePhotoBack = res.data.certificatePhotoBack; + // this.signingPeriod = res.data.signingPeriod; + // if (res.data) { + // // 申请人信息 + // this.infoData.certificatePhotoBack = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoBack, + // response: { + // url: res.data.certificatePhotoBack, + // }, + // }, + // ]; + // this.infoData.certificatePhotoFront = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoFront, + // response: { + // url: res.data.certificatePhotoFront, + // }, + // }, + // ]; + // if (!res.data.validEndTime) { + // this.infoData1.dateType = true; + // // this.sf.getProperty('/validStartTime').schema.readOnly = true; + // // this.sf.getProperty('/validEndTime').schema.readOnly = true; + // } + // } + // if (res.data) { + // // 营业执照基本信息 + // this.infoData1.enterpriseQualificationCertificate = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.enterpriseQualificationCertificate, + // response: { + // url: res.data.enterpriseQualificationCertificate, + // }, + // }, + // ]; + // this.infoData1.certificatePhotoFront = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoFront, + // response: { + // url: res.data.certificatePhotoFront, + // }, + // }, + // ]; + // this.infoData1.certificatePhotoBack = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoBack, + // response: { + // url: res.data.certificatePhotoBack, + // }, + // }, + // ]; + // this.infoData1.unifiedSocialCreditCode = res.data.unifiedSocialCreditCode; + // this.infoData1.enterpriseName = res.data.enterpriseName; + // this.infoData1.enterpriseType = res.data.enterpriseType; + // this.infoData1.enterpriseAddress = res.data.enterpriseAddress; + // // this.infoData1.enterpriseAddressCodeStr = res.data.businessLicenseJson.enterpriseAddressCodeStr; + // // this.infoData1.enterpriseBusinessAddressCodeStr = res.data.businessLicenseJson.enterpriseBusinessAddressCodeStr; + // this.infoData1.registrationCapital = res.data.registrationCapital; + // this.infoData1.enterpriseRegistrationTime = res.data.enterpriseRegistrationTime; + // this.infoData1.operatingStartTime = res.data.operatingStartTime; + // this.infoData1.operatingEndTime = res.data.operatingEndTime; + // this.infoData1.businessScope = res.data.businessScope; + // this.enterpriseAddressCodeStr = res.data.enterpriseAddressCodeStr; + // this.enterpriseAddressCode = +res.data.enterpriseAddressCode; + // this.getRegionDetailByCode(res.data.enterpriseAddressCode); + + // this.enterpriseBusinessAddressCodeStr = res.data.enterpriseBusinessAddressCodeStr; + // this.enterpriseBusinessAddressCode = res.data.enterpriseBusinessAddressCode; + // if (!res.data.operatingEndTime) { + // this.infoData1.dateType1 = true; + // } + // this.infoData.contactsName = res.data.contactsName; + // this.infoData.telephone = res.data.contactsPhone; + // this.infoData1.operationUserPhone = res.data.contactsPhone; + // } + // this.initSF(); + // }); + } + reloadApply() { + // 重新申请入驻 + this.modalService.confirm({ + nzTitle: '确定要重新申请入驻吗?', + nzContent: '当前申请已填写的资料将清空,重新申请需要重新填写资料', + nzOnOk: () => + new Promise((resolve, reject) => { + this.sf.reset(); + resolve(1); + }).catch(() => console.log('Oops errors!')), + }); + } + + updateBranchList(bankId: any, regionCode: any) { + // return this.service + // .loadBranchBankList(bankId, regionCode) + // .pipe( + // map((data) => { + // return data.map((m) => { + // return { label: m.branchName, value: m.branchCode }; + // }); + // }), + // ) + // .subscribe((res) => { + // // this.sf2.getProperty('/bankBranchName')!.schema.enum = res; + // // this.sf2.getProperty('/bankBranchName')!.widget.reset(res || res[0]); + // this.branchBanks = res || []; + // // this.initSF(); + // }); + } + loadBranchBanks(bankId: any, regionCode: any) { + // this.service + // .loadBranchBankList(bankId, regionCode) + // .pipe( + // map((data) => { + // return data.map((m) => { + // return { label: m.branchName, value: m.branchCode }; + // }); + // }), + // ) + // .subscribe((res: any[]) => { + // this.branchBanks = res || []; + // this.getUserDetail(); + this.loadBrandDist(); + this.updateBranchList(bankId, regionCode); + // }); + } + loadBrandDist() { + // this.service.http.post(this.service.$api_get_all_region).subscribe((res) => { + // const data = res.data; + // data.forEach((item: { children: any[] }) => { + // item.children.forEach((element: { isLeaf: boolean }) => { + // element.isLeaf = true; + // }); + // }); + // // this.sf2.getProperty('/bankAreaArr').schema.enum = data; + // // this.sf2.getProperty('/bankAreaArr').widget.reset(data); + // this.bankRegion = data; + // this.initSF(); + // }); + } + + getProvinceData() { + // return this.service.http.post(this.service.$api_getRegionByCode, { regionCode: '' }).pipe( + // map((res) => { + // return res.data.map((m: { name: any; regionCode: any }) => { + // return { label: m.name, value: m.regionCode }; + // }); + // }), + // ); + } + updateArea(parentId: string, target: string, type: number, nextTarget: string, sfObj: SFComponent): any { + // 改变二级数据时,同时清空三级数据 + if (type === 2 && sfObj) { + sfObj.getProperty(nextTarget)!.schema.enum = []; + sfObj.getProperty(nextTarget)!.widget.reset([]); + sfObj.getProperty(nextTarget)!.setValue(null, true); + } + + if (!parentId && sfObj) { + sfObj.getProperty(target)!.schema.enum = []; + sfObj.getProperty(target)!.widget.reset([]); + sfObj.getProperty(target)!.setValue(null, true); + } else { + // return this.service.http + // .get(this.service.$api_getRegionByCode, { regionCode: parentId }) + // .pipe( + // map((res) => { + // return res.data.map((m: { regionFullName: string; name: any; regionCode: any }) => { + // const fullName = m.regionFullName.split(',').reverse().join(''); + // return { label: m.name, value: m.regionCode, fullName }; + // }); + // }), + // ) + // .subscribe((res) => { + // sfObj.getProperty(target)!.schema.enum = res; + // sfObj.getProperty(target)!.widget.reset(res); + // }); + } + } + getCategoryList() { + // return this.service.http.post(this.service.$api_getCategoryList, { id: '' }).pipe( + // map((data) => { + // return data.data.map((m: { name: any; id: any }) => { + // return { label: m.name, value: m.id }; + // }); + // }), + // ); + // .subscribe((res) => { + // this.sf3.getProperty('/classify').schema.enum = res; + // this.sf3.getProperty('/classify').widget.reset(res || res[0]); + // }); + } + getEnterpriseInfo(id: any) { + // 查询企业信息详情 + const params: any = { + id, + }; + // this.service.http.post(this.service.$api_getEnterpriseInfo, params).subscribe((res) => { + // this.signingPeriod = res.data.signingPeriod; + // }); + } + + + + auditSupplier(contractNo: any) { + // 审核供应商,签署成功需要调此接口 + const params = { + auditStatus: 7, + id: this.id, + contractNum: contractNo, + }; + // this.service.request(this.service.$api_auditSupplier, params).subscribe((res) => { + // this.service.msgSrv.success('签署成功!'); + // this.step = 3; + // this.infoData.auditStatus = 7; + // }); + } + cancel(): void { + this.msg.info('已取消'); + } + /* + * 根据地区code查询地区详情 + * code:请求参数 + * type:参数 name:获取省市区名称,fullcode:获取省市区code + * num:参数 1:第一个地区选择,2:第二个地区选择 + */ + getRegionDetailByCode(code: any) { + // 根据地区code查询地区详情 + // this.service.http.post(this.service.$api_getRegionDetailByCode, { regionCode: code }).subscribe((res) => { + // // 供选择地区保存-获取省市区名称 + // // 第二个地区选择 + + // const a = res.data.regionFullCodes.split(','); + + // this.sf1?.setValue('/region', [+a[0], +a[1], +a[2]]); + // this.enterpriseBusinessAddressCodeStr = res.data.regionFullName.replace(/,/g, ''); + // }); + } + longTime(i: boolean | SFSchemaEnum[], type: string) { + if (type === 'schema') { + if (i) { + // this.sf?.setValue('/validStartTime', Date); + this.sf?.setValue('/validEndTime', Date); + // this.sf.getProperty('/validStartTime').schema.readOnly = true; + this.sf.getProperty('/validEndTime')!.schema.readOnly = true; + } else { + // this.sf.getProperty('/validStartTime').schema.readOnly = false; + this.sf.getProperty('/validEndTime')!.schema.readOnly = false; + } + } + if (type === 'schema1') { + if (i) { + // this.sf1?.setValue('/operatingStartTime', Date); + this.sf1?.setValue('/operatingEndTime', Date); + // this.sf1.getProperty('/operatingStartTime').schema.readOnly = true; + this.sf1.getProperty('/operatingEndTime')!.schema.readOnly = true; + } else { + // this.sf1.getProperty('/operatingStartTime').schema.readOnly = false; + this.sf1.getProperty('/operatingEndTime')!.schema.readOnly = false; + } + } + if (type === 'schema11') { + if (i) { + // this.sf1?.setValue('/validStartTime', Date); + this.sf1?.setValue('/validEndTime', Date); + // this.sf1.getProperty('/validStartTime').schema.readOnly = true; + this.sf1.getProperty('/validEndTime')!.schema.readOnly = true; + } else { + // this.sf1.getProperty('/validStartTime').schema.readOnly = false; + this.sf1.getProperty('/validEndTime')!.schema.readOnly = false; + } + } + } + prev() { + // 返回上一步 + if (this.subStep > 0) { + this.subStep--; + } + if (this.subStep === 2) { + if (this.id) { + this.loadBranchBanks(this.infoData2.bankCode, this.infoData2.bankAddressCode); + } else { + this.loadBrandDist(); + } + } + } + clearData() { + // 重新申请 + const params: any = { + id: this.id, + }; + // this.service.request(this.service.$api_deleteApplyCache, params).subscribe((res) => { + // if (res) { + // this.service.msgSrv.success('已清除申请资料,请重新申请!'); + // this.edit(); + // this.id = ''; + // this.infoData = {}; + // this.infoData1 = {}; + // this.infoData2 = { + // accountName: '', + // }; + // this.infoData3 = {}; + // } + // }); + } + edit() { + this.subStep = 0; + this.getApplicationInfo2(this.routerinfo.snapshot.queryParams.id); + } + goPage(page: string) { + if (page === 'list') { + this.router.navigate(['./account/role']); + } else { + this.router.navigate(['./account/apply-list']); + } + } + goBack() { + window.history.go(-1); + } + onChange(result: Date): void {} + refreshPage() { + window.location.reload(); + } + checkIdCard(imgurl: any, isFront: number, type: number) { + // 识别身份证 参数isFront:0-正面、1-背面;type:0-申请人身份证,1-法定代表人身份证 + const params = { + idCardImagePath: imgurl, + isFront, + }; + // this.service.request(this.service.$api_checkIdCard, params).subscribe((res) => { + // if (res) { + // if (type === 0) { + // // 申请人身份证 + // if (isFront === 0) { + // // 正面 + // if (res.name) { + // this.sf.setValue('/name', res.name); + // } + // if (res.idCardNumber) { + // this.sf.setValue('/certificateNumber', res.idCardNumber); + // } + // } + // if (isFront === 1) { + // // 背面 + // if (res.validFrom) { + // this.sf.setValue('/validStartTime', res.validFrom); + // } + // if (res.validTo) { + // this.sf.setValue('/validEndTime', res.validTo); + // } + // } + // } + // if (type === 1) { + // // 法定代表人身份证 + // if (isFront === 0) { + // // 正面 + // if (res.name) { + // this.sf1.setValue('/name', res.name); + // } + // if (res.idCardNumber) { + // this.sf1.setValue('/certificateNumber', res.idCardNumber); + // } + // } + // if (isFront === 1) { + // // 背面 + // if (res.validFrom) { + // this.sf1.setValue('/validStartTime', res.validFrom); + // } + // if (res.validTo) { + // this.sf1.setValue('/validEndTime', res.validTo); + // } + // } + // } + // } + // }); + } + checkBusinessLicense(imgurl: any) { + // 识别营业执照 + const params = { + licenseImagePath: imgurl, + }; + // this.service.request(this.service.$api_checkBusinessLicense, params).subscribe((res) => { + // if (res) { + // if (res.unifiedSocialCreditCode) { + // this.sf1.setValue('/unifiedSocialCreditCode', res.unifiedSocialCreditCode); + // } + // if (res.enterpriseName) { + // this.sf1.setValue('/enterpriseName', res.enterpriseName); + // } + // if (res.enterpriseType) { + // this.sf1.setValue('/enterpriseType', res.enterpriseType); + // } + // if (res.addressRegionCodes) { + // this.sf1.setValue('/region', res.addressRegionCodes); + // } + // if (res.address) { + // this.sf1.setValue('/enterpriseAddress', res.address); + // } + // if (res.foundDate) { + // this.sf1.setValue('/enterpriseRegistrationTime', res.foundDate); + // } + // if (res.registeredCapital) { + // this.sf1.setValue('/registrationCapital', res.registeredCapital); + // } + // if (res.businessTermStartDate) { + // this.sf1.setValue('/operatingStartTime', res.businessTermStartDate); + // } + // if (res.businessTermEndDate) { + // this.sf1.setValue('/operatingEndTime', res.businessTermEndDate); + // } + // if (res.businessScope) { + // this.sf1.setValue('/businessScope', res.businessScope); + // } + // const len = res.addressRegionCodes.length - 1; + // this.enterpriseAddressCode = res.addressRegionCodes[len]; + // this.enterpriseAddressCodeStr = res.addressRegionNames; + // if (!res.businessTermEndDate) { + // this.sf1.setValue('/dateType', true); + // } + // } + // }); + } + + // resetForm(): void { + // this.infoData.reset(); + // } +} diff --git a/src/app/routes/usercenter/components/freight/user/user.component.html b/src/app/routes/usercenter/components/freight/user/user.component.html new file mode 100644 index 00000000..b0d2de52 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/user/user.component.html @@ -0,0 +1,84 @@ + + + + + + +
+ +
+ + +
+ + + + +
+ +
+
+ + + + + +
+
+
+
+ + + + + + +
+
+ {{ item.enterpriseName }} +
+
+
+ +
+ {{ item.contactsPhone }} +
+
+ + 冻结 + 正常 + +
+
diff --git a/src/app/routes/usercenter/components/freight/user/user.component.spec.ts b/src/app/routes/usercenter/components/freight/user/user.component.spec.ts new file mode 100644 index 00000000..e695c14a --- /dev/null +++ b/src/app/routes/usercenter/components/freight/user/user.component.spec.ts @@ -0,0 +1,23 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { FreightComponentsListComponent } from './list.component'; + +describe('FreightComponentsListComponent', () => { + let component: FreightComponentsListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FreightComponentsListComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FreightComponentsListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/usercenter/components/freight/user/user.component.ts b/src/app/routes/usercenter/components/freight/user/user.component.ts new file mode 100644 index 00000000..28210434 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/user/user.component.ts @@ -0,0 +1,228 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STColumnBadge, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { UsermanageService } from '../../../services/usercenter.service'; +@Component({ + selector: 'app-Freight-components-user', + templateUrl: './user.component.html', +}) +export class FreightComponentsUserComponent implements OnInit { + _$expand = false; + url = `/rule?_allow_anonymous=true`; + + ui!: SFUISchema; + schema!: SFSchema; + columns!: STColumn[]; + datalist = [ + { + storeName: '企业名称', + contactsName: '152746565', + enterpriseName: '湖南', + unifiedSocialCreditCode: '45454', + contactsPhone: '*97889461561', + effectiveDateStr: '废弃eww', + enStatusStr2: '正常', + enStatusStr3: '正常', + unifiedSocialCreditCode3: '常用服务', + unifiedSocialCreditCode2: '正常', + tenantId: 1 + }, + { + storeName: '企业名称', + contactsName: '152746565', + enterpriseName: '湖南', + unifiedSocialCreditCode: '45454', + contactsPhone: '*97889461561', + effectiveDateStr: '废弃eww', + enStatusStr2: '正常', + enStatusStr3: '正常', + unifiedSocialCreditCode3: '常用服务', + unifiedSocialCreditCode2: '正常', + tenantId: 2 + }, + ] + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + + constructor(public service: UsermanageService, private modal: NzModalService, private router: Router, private ar: ActivatedRoute) {} + /** + * 查询字段个数navigate + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + + /** + * 查询参数 + */ + get reqParams() { + const params: any = { + ...(this.sf && this.sf.value), + }; + if (this.sf?.value.effectiveDate) { + params.effectiveDateStart = this.sf?.value.effectiveDate[0]; + params.effectiveDateEnd = this.sf?.value.effectiveDate[1]; + } + delete params.effectiveDate; + delete params.expand; + return params; + } + + get selectedRows() { + return this.st?.list.filter((item) => item.checked) || []; + } + + ngOnInit() { + this.initSF(); + this.initST(); + this.ar.url.subscribe((params) => { + this.st?.load(1); + }); + } + dataProcess(data: STData[]): STData[] { + return data.map((i, index) => { + i.showSortFlag = false; + return i; + }); + } + initSF() { + this.schema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true, + }, + }, + storeName: { title: '企业名称', type: 'string', ui: { showRequired: false } }, + contactsName: { + title: '联系人', + type: 'string', + ui: { + showRequired: false, + }, + }, + unifiedSocialCreditCode: { + title: '税源地', + type: 'string', + ui: { + showRequired: false, + }, + }, + enStatus: { + type: 'string', + title: '货主状态', + enum: [ + { label: '全部', value: '' }, + { label: '正常', value: 0 }, + { label: '冻结', value: 1 }, + { label: '废弃', value: 2 }, + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value, + }, + }, + }, + enStatus2: { + type: 'string', + title: 'CRM审核状态', + enum: [ + { label: '全部', value: '' }, + { label: '正常', value: 0 }, + { label: '冻结', value: 1 }, + { label: '废弃', value: 2 }, + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value, + }, + }, + }, + }, + }; + this.ui = { '*': { spanLabelFixed: 90, grid: { span: 8, gutter: 4 }, enter: () => this.st.load() } }; + } + + initST() { + this.columns = [ + // { title: '', type: 'checkbox', className: 'text-center' }, + { title: '企业名称', className: 'text-center', index: 'storeName' }, + { title: '联系人', className: 'text-center', index: 'contactsName' }, + { title: '税源地', className: 'text-center', render: 'enterpriseName' }, + { title: '累计运单金额', className: 'text-center', index: 'unifiedSocialCreditCode' }, + { title: '道运证', className: 'text-center', index: 'contactsPhone', + render: 'contactsPhone' + }, + { title: '企业状态', className: 'text-center', index: 'effectiveDateStr', + type: 'badge', + badge: { + 正常: { text: '正常', color: 'success' }, + 冻结: { text: '冻结', color: 'warning' }, + 废弃: { text: '废弃', color: 'default' }, + }, + }, + { + title: 'CRM审核状态', + className: 'text-center', + index: 'enStatusStr2', + type: 'badge', + badge: { + 正常: { text: '正常', color: 'success' }, + 冻结: { text: '冻结', color: 'warning' }, + 废弃: { text: '废弃', color: 'default' }, + }, + }, + { + title: '代收权限', + className: 'text-center', + index: 'enStatusStr3', + type: 'badge', + badge: { + 正常: { text: '正常', color: 'success' }, + 冻结: { text: '冻结', color: 'warning' }, + 废弃: { text: '废弃', color: 'default' }, + }, + }, + { title: '常用服务', className: 'text-center', index: 'unifiedSocialCreditCode3' }, + { title: '推广业务员', className: 'text-center', index: 'unifiedSocialCreditCode2' }, + { + title: '操作', + width: '170px', + className: 'text-center', + buttons: [ + { + text: '查看', + click: (item) => { + this.router.navigate(['./detail', item.tenantId], { relativeTo: this.ar }); + // this.router.navigate(['./view', item.id], { relativeTo: this.ar, queryParams: { tenantId: item.tenantId } }); + }, + }, + ], + }, + ]; + } + daoyun(item: any) { + this.router.navigate(['./view', item.tenantId], { relativeTo: this.ar }); + } + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + creat() { + this.router.navigate(['./new',], { relativeTo: this.ar }); + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } +} diff --git a/src/app/routes/usercenter/components/freight/user/view/view.component.html b/src/app/routes/usercenter/components/freight/user/view/view.component.html new file mode 100644 index 00000000..96d0bc91 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/user/view/view.component.html @@ -0,0 +1,49 @@ + + + + + + + + + + + + +

道路运输经营许可证

+ +
+ + +
+
+
+ + diff --git a/src/app/routes/usercenter/components/freight/user/view/view.component.less b/src/app/routes/usercenter/components/freight/user/view/view.component.less new file mode 100644 index 00000000..48f605d9 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/user/view/view.component.less @@ -0,0 +1,46 @@ +@import '~@delon/theme/index'; +:host { + ::ng-deep { + .ant-steps-dot { + .ant-steps-item-content { + width: 200px; + } + .ant-steps-item-icon { + margin-left: 96px; + } + .ant-steps-item-tail::after { + margin-left: 40px; + } + } + .success { + color: @success-color; + } + + .warning { + color: @warning-color; + } + + .error { + color: @error-color; + } + } + .mt16 { + margin-top: 16px; + } + .user-info { + display: flex; + font-size: 16px; + .enterprise-name { + margin-right: 15px; + } + img { + width: 64px; + height: 64px; + margin-right: 15px; + border-radius: 50%; + } + .user-info-des { + margin-bottom: 5px; + } + } +} diff --git a/src/app/routes/usercenter/components/freight/user/view/view.component.spec.ts b/src/app/routes/usercenter/components/freight/user/view/view.component.spec.ts new file mode 100644 index 00000000..6e2a7782 --- /dev/null +++ b/src/app/routes/usercenter/components/freight/user/view/view.component.spec.ts @@ -0,0 +1,23 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { FreightComponentsListViewComponent } from './view.component'; + +describe('FreightComponentsListViewComponent', () => { + let component: FreightComponentsListViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FreightComponentsListViewComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FreightComponentsListViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/usercenter/components/freight/user/view/view.component.ts b/src/app/routes/usercenter/components/freight/user/view/view.component.ts new file mode 100644 index 00000000..f72bb40a --- /dev/null +++ b/src/app/routes/usercenter/components/freight/user/view/view.component.ts @@ -0,0 +1,257 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { UsermanageService } from '../../../../services/usercenter.service'; +import { SFComponent, SFSchema, SFDateWidgetSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form'; +import { Observable, Observer } from 'rxjs'; +@Component({ + selector: 'app-Freight-components-list-view', + templateUrl: './view.component.html', + styleUrls: ['./view.component.less'], +}) +export class FreightComponentsListViewComponent implements OnInit { + i: any; + url = `/rule?_allow_anonymous=true`; + + @ViewChild('st', { static: false }) st!: STComponent; + detailData: any = { + status: 0 + }; + isShow = false; + isVisible = false; + modalTitle = '有效期'; + modalName = ''; + ui!: SFUISchema; + schema!: SFSchema; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sf1', { static: false }) sf1!: SFComponent; + validData: any = ['FreightsType']; + FreightsData: any = {}; + + constructor( + private http: _HttpClient, + private modal: ModalHelper, + public service: UsermanageService, + private route: ActivatedRoute, + private modalHelper: ModalHelper, + private msgSrv: NzMessageService, + ) {} + + ngOnInit() { + console.log(this.route.snapshot); + this.initData(); + this.initSF(); + // this.launchSign(); + } + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + name: { + title: '许可证号', + type: 'string', + maxLength: 20, + ui: { + placeholder: '请输入角色名称', + }, + }, + phone: { + title: '业户名称', + type: 'string', + maxLength: 20, + ui: { + placeholder: '请输入业户名称', + }, + }, + roleDescription: { + title: '地址', + type: 'string', + maxLength: 30, + ui: { + placeholder: '请输入地址', + widget: 'textarea', + }, + }, + effectiveDate: { + title: '发证日期', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd 00:00:00', + // hidden: this.modalName === 'effectiveDate' ? false : true, + } as SFDateWidgetSchema, + }, + phone3: { + title: '有效期', + type: 'string', + ui: { + placeholder: '请输入业户名称', + }, + }, + phone4: { + title: '有效期截止', + type: 'string', + ui: { + placeholder: '请输入业户名称', + }, + }, + phone5: { + title: '经营范围', + type: 'string', + ui: { + placeholder: '请输入业户名称', + }, + }, + avatar: { + type: 'string', + title: '证照', + ui: { + // action: environment.UPLOAD_URL, + fileType: 'image/png,image/jpeg,image/jpg,image/png,image/gif,image/bmp', + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: environment.appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + const avatar = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: args.fileList[0].response.url, + response: { + url: args.fileList[0].response.url, + }, + }, + ]; + this.sf?.setValue('/avatar', avatar); + } + }, + beforeUpload: (file: any, _fileList) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 5; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + }, + } as SFUploadWidgetSchema, + }, + }, + required: ['name', 'phone'], + }; + this.ui = { '*': { spanLabelFixed: 200, grid: {offset:4, span: 12 } } }; + } + showModal(name: any) { + this.modalName = name; + if (name === 'effectiveDate') { + this.isShow = true; + } else { + this.isVisible = true; + } + } + async initData() { + console.log(this.route.snapshot, 'this.route.snapshot'); + + const params = { + tenantId: this.route.snapshot.params.id, + }; + } + + /** + * 根据地区code查询地区详情 + * @param code 地区代码 + */ + async getRegionFullName(code: any) { + const params = { + regionCode: code, + }; + const res = await this.service.asyncRequest(this.service.$api_get_region_detailByCode, params, 'POST', true); + // if (res && res.regionFullName) { + // const arr = res.regionFullName.split(','); + // res.regionFullName = arr.reverse().join('-'); + // } + return res && res.regionFullName; + } + add() { + // this.modal + // .createStatic(FormEditComponent, { i: { id: 0 } }) + // .subscribe(() => this.st.reload()); + } + goBack() { + window.history.go(-1); + } + /** + * 冻结 + */ + freezeOrResume(type: number) { + this.service.http + .post(this.service.$api_set_freezeOrResume, { + tenantId: this.route.snapshot.params.id, + // tenantId: this.route.snapshot.queryParams.tenantId, + status: type, + }) + .subscribe((res) => { + if (res.data === true) { + if (type === 0) { + this.service.msgSrv.success(`启用成功!`); + } else if (type === 1) { + this.service.msgSrv.success(`冻结成功!`); + } + this.ngOnInit(); + } else { + this.service.msgSrv.error(res.msg || '操作失败!'); + } + }); + } + + handleCancel(name: any) { + if (name === 'effectiveDate') { + this.isShow = false; + } else { + this.isVisible = false; + } + } + handleOK(name: any) { + const params: any = { + tenantId: this.route.snapshot.params.id, + // tenantId: this.route.snapshot.queryParams.tenantId, + }; + + if (name === 'effectiveDate') { + params.effectiveDate = this.sf?.value?.effectiveDate; + } else { + Object.assign(params, this.sf1?.value); + } + this.service.http.post(this.service.$api_set_freezeOrResume, params).subscribe((res) => { + if (res.data === true) { + this.service.msgSrv.success(`编辑成功!`); + this.ngOnInit(); + } else { + this.service.msgSrv.error(res.msg || '编辑失败!'); + } + if (name === 'effectiveDate') { + this.isShow = false; + } else { + this.isVisible = false; + } + }); + } +} diff --git a/src/app/routes/usercenter/usercenter-routing.module.ts b/src/app/routes/usercenter/usercenter-routing.module.ts index 83e2ef69..ca4cb7bd 100644 --- a/src/app/routes/usercenter/usercenter-routing.module.ts +++ b/src/app/routes/usercenter/usercenter-routing.module.ts @@ -1,7 +1,7 @@ /* * @Author: your name * @Date: 2021-11-29 15:22:34 - * @LastEditTime: 2021-11-30 10:29:19 + * @LastEditTime: 2021-11-30 15:12:16 * @LastEditors: Please set LastEditors * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: \tms-obc-web\src\app\routes\usercenter\usercenter-routing.module.ts @@ -15,6 +15,7 @@ import { FreightComponentsListDetailComponent } from './components/freight/list/ import { FreightComponentsListComponent } from './components/freight/list/list.component'; import { FreightComponentsListNewComponent } from './components/freight/list/new/new.component'; import { FreightComponentsListViewComponent } from './components/freight/list/view/view.component'; +import { FreightComponentsUserComponent } from './components/freight/user/user.component'; const routes: Routes = [ @@ -25,6 +26,7 @@ const routes: Routes = [ { path: 'freight/list/detail/:id', component: FreightComponentsListDetailComponent }, { path: 'freight/enterprise', component: FreightComponentsEnterpriseAuditComponent }, { path: 'freight/enterprise/view/:id', component: FreightComponentsEnterpriseAuditViewComponent }, + { path: 'freight/user', component: FreightComponentsUserComponent }, ]; @NgModule({ diff --git a/src/app/routes/usercenter/usercenter.module.ts b/src/app/routes/usercenter/usercenter.module.ts index 3dac1057..6a275546 100644 --- a/src/app/routes/usercenter/usercenter.module.ts +++ b/src/app/routes/usercenter/usercenter.module.ts @@ -14,6 +14,7 @@ import { FreightComponentsListDetailComponent } from './components/freight/list/ import { FreightComponentsListComponent } from './components/freight/list/list.component'; import { FreightComponentsListNewComponent } from './components/freight/list/new/new.component'; import { FreightComponentsListViewComponent } from './components/freight/list/view/view.component'; +import { FreightComponentsUserComponent } from './components/freight/user/user.component'; import { UsercenterRoutingModule } from './usercenter-routing.module'; const COMPONENTS = [ @@ -22,7 +23,8 @@ const COMPONENTS = [ FreightComponentsListNewComponent, FreightComponentsListDetailComponent, FreightComponentsEnterpriseAuditComponent, - FreightComponentsEnterpriseAuditViewComponent + FreightComponentsEnterpriseAuditViewComponent, + FreightComponentsUserComponent ]; @NgModule({ diff --git a/src/assets/mocks/menu-data.json b/src/assets/mocks/menu-data.json index ccce72da..cd533255 100644 --- a/src/assets/mocks/menu-data.json +++ b/src/assets/mocks/menu-data.json @@ -69,6 +69,11 @@ "hide": true, "icon": "anticon anticon-dashboard", "link": "/usercenter/freight/enterprise/view/:id" + }, + { + "text": "用户列表", + "icon": "anticon anticon-dashboard", + "link": "/usercenter/user" } ] } From 540c845ca9cacae64d2a853754e58270c9b91ba9 Mon Sep 17 00:00:00 2001 From: wangshiming Date: Tue, 30 Nov 2021 15:56:18 +0800 Subject: [PATCH 0010/1600] =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=B8=AD=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../freight/user/detail/detail.component.ts | 2 +- .../freight/user/new/new.component.html | 109 -- .../freight/user/new/new.component.less | 109 -- .../freight/user/new/new.component.ts | 1400 ----------------- .../freight/user/user.component.html | 77 +- .../components/freight/user/user.component.ts | 118 +- .../freight/user/view/view.component.html | 49 - .../freight/user/view/view.component.less | 46 - .../freight/user/view/view.component.spec.ts | 23 - .../freight/user/view/view.component.ts | 257 --- .../usercenter/usercenter-routing.module.ts | 4 +- .../routes/usercenter/usercenter.module.ts | 4 +- src/assets/mocks/menu-data.json | 2 +- 13 files changed, 152 insertions(+), 2048 deletions(-) delete mode 100644 src/app/routes/usercenter/components/freight/user/new/new.component.html delete mode 100644 src/app/routes/usercenter/components/freight/user/new/new.component.less delete mode 100644 src/app/routes/usercenter/components/freight/user/new/new.component.ts delete mode 100644 src/app/routes/usercenter/components/freight/user/view/view.component.html delete mode 100644 src/app/routes/usercenter/components/freight/user/view/view.component.less delete mode 100644 src/app/routes/usercenter/components/freight/user/view/view.component.spec.ts delete mode 100644 src/app/routes/usercenter/components/freight/user/view/view.component.ts diff --git a/src/app/routes/usercenter/components/freight/user/detail/detail.component.ts b/src/app/routes/usercenter/components/freight/user/detail/detail.component.ts index 809f567f..ba6984d0 100644 --- a/src/app/routes/usercenter/components/freight/user/detail/detail.component.ts +++ b/src/app/routes/usercenter/components/freight/user/detail/detail.component.ts @@ -11,7 +11,7 @@ import { UsermanageService } from '../../../../services/usercenter.service'; templateUrl: './detail.component.html', styleUrls: ['./detail.component.less'], }) -export class FreightComponentsListDetailComponent implements OnInit { +export class FreightComponentsUserDetailComponent implements OnInit { i: any; url = `/rule?_allow_anonymous=true`; @ViewChild('st', { static: false }) st!: STComponent; diff --git a/src/app/routes/usercenter/components/freight/user/new/new.component.html b/src/app/routes/usercenter/components/freight/user/new/new.component.html deleted file mode 100644 index fe0400fa..00000000 --- a/src/app/routes/usercenter/components/freight/user/new/new.component.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - -
营业执照基本信息
-
- -
营业执照法人信息
-
- -
- 请上传营业执照原件的高清照片,若上传复印件,则需加盖公司印章; -
上传后系统会自动识别并填写
-
-
- -
万元
-
- - -
-
请上传身份证原件的高清照片,若上传复印件,则需申请人签字;
-
上传后系统会自动识别并填写
-
-
- -
-
-
正面照(人像面)
-
示例
-
-
-
-
- -
-
-
背面照(国徽面)
-
示例
-
-
-
-
- -
- - -
公司其他补充信息
-
- -
企业管理员信息
-
- - -
-
请上传该企业授权您成为本系统企业管理员的文件的高清照片,需加盖公司印章
-
上传后系统会自动识别并填写
-
-
-
- -
-
-
-
示例
-
-
-
-
- -
-
{{ telephone }} 默认当前登录账号绑定的手机号
-
-
- -
-
请上传身份证原件的高清照片,若上传复印件,则需申请人签字;
-
上传后系统会自动识别并填写
-
-
- -
-
-
正面照(人像面)
-
示例
-
-
-
-
- -
-
-
背面照(国徽面)
-
示例
-
-
-
-
- -
- - -
- - -
-
-
diff --git a/src/app/routes/usercenter/components/freight/user/new/new.component.less b/src/app/routes/usercenter/components/freight/user/new/new.component.less deleted file mode 100644 index 55bf514e..00000000 --- a/src/app/routes/usercenter/components/freight/user/new/new.component.less +++ /dev/null @@ -1,109 +0,0 @@ -:host { - ::ng-deep { - nz-card { - .page-title { - margin-bottom: 39px; - color : #333; - font-weight : 500; - font-size : 20px; - line-height : 28px; - text-align : center; - } - - .step-title { - display: block; - width : 800px !important; - margin : 0 auto; - } - - .myForm { - width : 680px; - margin: 5rem auto; - } - - .steps-content { - min-height: 250px; - } - - .btn-submit { - margin-top: 16px; - } - - .pr { - position: relative; - } - - .pa { - position: absolute; - top : 35px; - left : 150px; - } - - .tips { - display : flex; - margin-bottom: 0; - color : #333; - - dt { - width: 150px; - } - - dd { - width : 190px; - margin-bottom: 0; - text-align : center; - } - } - - .form-title { - margin-bottom: 10px; - padding-left : 8px; - color : #333; - font-weight : 700; - font-size : 18px; - line-height : 20px; - border-left : solid 3px #1890ff; - } - - .form-content { - padding: 48px 32px; - } - - .apply-sv { - margin : 16px 0; - padding : 20px; - background : #f8f8f8; - border-radius: 2px; - } - - .result-date { - font-size: 12px; - } - - .result-tips { - color : #ff4d4f; - font-size: 14px; - } - - .sv-img { - display : inline-block; - width : 104px; - height : 104px; - margin-right : 20px; - padding : 8px; - background : #fff; - border : 1px solid rgba(0, 0, 0, 0.15); - border-radius: 2px; - - img { - width : 100%; - height: 100%; - } - } - } - - .ant-row { - margin-left: 100px; - } - } -} \ No newline at end of file diff --git a/src/app/routes/usercenter/components/freight/user/new/new.component.ts b/src/app/routes/usercenter/components/freight/user/new/new.component.ts deleted file mode 100644 index df20847f..00000000 --- a/src/app/routes/usercenter/components/freight/user/new/new.component.ts +++ /dev/null @@ -1,1400 +0,0 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; -import { apiConf } from '@conf/api.conf'; -import { - SFCascaderWidgetSchema, - SFCheckboxWidgetSchema, - SFComponent, - SFDateWidgetSchema, - SFSchema, - SFSchemaEnum, - SFSelectWidgetSchema, - SFTextareaWidgetSchema, - SFUISchema, - SFUploadWidgetSchema, -} from '@delon/form'; -import { ModalHelper } from '@delon/theme'; -import { EnvironmentService } from '@env/environment.service'; -import { NzCascaderOption } from 'ng-zorro-antd/cascader'; -import { NzMessageService } from 'ng-zorro-antd/message'; -import { NzModalService } from 'ng-zorro-antd/modal'; -import { map } from 'rxjs/operators'; -// import { AccountService } from '../../services/account.service'; -// import { AccountComponentsImgViewComponent } from '../img-view/img-view.component'; - -@Component({ - selector: 'app-account-components-freight-new', - templateUrl: './new.component.html', - styleUrls: ['./new.component.less'], -}) -export class FreightComponentsListNewComponent implements OnInit { - url = `/rule?_allow_anonymous=true`; - - @ViewChild('sf', { static: false }) - sf!: SFComponent; - @ViewChild('sf1', { static: false }) - sf1!: SFComponent; - // @ViewChild('sf2', { static: false }) - // sf2!: SFComponent; - // @ViewChild('sf3', { static: false }) - // sf3!: SFComponent; - telephone = ''; - record: any = {}; - i: any; - schema!: SFSchema; - schema1!: SFSchema; - // schema2!: SFSchema; - // schema3!: SFSchema; - ui!: SFUISchema; - - id!: string; - isEdit!: boolean; - subStep = 0; - infoData: any = {}; - infoData1: any = {}; - infoData2: any = { - accountName: '', - }; - infoData3: any = {}; - branchBankName = ''; - bankArea = ''; - bankName = ''; - bankLogoUrl = ''; - bankRegion: any[] = []; - branchBanks: any[] = []; - signingPeriod = 2; - pdfSrc: any; - result = true; - enterpriseAddressCodeStr = ''; - enterpriseAddressCode: any; - enterpriseBusinessAddressCodeStr = ''; - enterpriseBusinessAddressCode = ''; - taxpayerTypeStr = ''; - regionData: any = []; - aptitudes: any = []; - constructor( - private routerinfo: ActivatedRoute, - public msg: NzMessageService, - private router: Router, - private modalService: NzModalService, - private modal: ModalHelper, - ) {} - ngOnInit() { - this.id = this.routerinfo.snapshot.queryParams.id; - - if (this.routerinfo.snapshot.queryParams.id) { - this.isEdit = true; - this.getApplicationInfo(this.routerinfo.snapshot.queryParams.id); - } else { - this.getUserDetail(); - } - this.initSF(); - } - initSF() { - this.schema = { - properties: { - title1: { - title: '', - type: 'string', - ui: { - widget: 'custom', - }, - }, - - // tipsE: { - // title: '', - // type: 'string', - // ui: { - // widget: 'custom', - // offsetControl: 6, - // }, - // }, - tipsD: { - title: '企业授权函', - type: 'string', - ui: { - widget: 'custom', - }, - }, - tipsE: { - title: '', - type: 'string', - ui: { - widget: 'custom', - offsetControl: 6, - }, - }, - certificatePhotoFront2: { - type: 'string', - title: '', - ui: { - offsetControl: 6, - action: apiConf.fileUpload, - fileType: 'image/png,image/jpeg,image/jpg,image/gif', - fileSize: 5120, - limit: 1, - limitFileCount: 1, - resReName: 'url', - urlReName: 'url', - widget: 'upload', - descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', - data: { - // appId: this.envSrv.getEnvironment().appId, - }, - name: 'multipartFile', - multiple: false, - listType: 'picture-card', - change: (args) => { - if (args.type === 'success') { - this.checkIdCard(args.fileList[0].response.url, 0, 1); - } - }, - } as SFUploadWidgetSchema, - }, - region2: { - type: 'number', - title: '常用服务', - enum: this.regionData, - // default: [110000, 110100, 110105], - ui: { - width: 700, - widget: 'cascader', - valueProperty: 'regionCode', - labelProperty: 'name', - change: (ngModel: string | any[]) => { - const len = ngModel.length - 1; - this.enterpriseAddressCode = ngModel[len]; - // this.getRegionDetailByCode(ngModel[len],'name', 1); // 获取省市区名称 - }, - selectionChange: (values: NzCascaderOption[]) => { - // 获取省市区名称 - const len = values.length - 1; - this.enterpriseAddressCodeStr = values[len].regionFullName.split(',').reverse().join(''); - }, - }, - }, - contactsName: { - title: '推广业务员手机号', - type: 'string', - minLength: 1, - maxLength: 32, - ui: { - width: 700, - placeholder: '请输入您的真实姓名', - errors: { - required: '请输入您的真实姓名', - }, - }, - }, - title99: { - title: '', - type: 'string', - ui: { - widget: 'custom', - }, - }, - tipsA: { - title: '企业管理员证件照', - type: 'string', - ui: { - widget: 'custom', - }, - }, - certificatePhotoFront: { - type: 'string', - title: '', - ui: { - offsetControl: 6, - action: apiConf.fileUpload, - fileType: 'image/png,image/jpeg,image/jpg,image/gif', - fileSize: 5120, - limit: 1, - limitFileCount: 1, - resReName: 'url', - urlReName: 'url', - widget: 'upload', - descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', - data: { - // appId: this.envSrv.getEnvironment().appId, - }, - name: 'multipartFile', - multiple: false, - listType: 'picture-card', - change: (args) => { - if (args.type === 'success') { - this.checkIdCard(args.fileList[0].response.url, 0, 1); - } - }, - } as SFUploadWidgetSchema, - }, - tipsB: { - title: '', - type: 'string', - ui: { - widget: 'custom', - offsetControl: 6, - }, - }, - certificatePhotoBack: { - type: 'string', - title: '', - ui: { - offsetControl: 6, - action: apiConf.fileUpload, - fileType: 'image/png,image/jpeg,image/jpg,image/gif', - fileSize: 5120, - limit: 1, - limitFileCount: 1, - resReName: 'url', - urlReName: 'url', - widget: 'upload', - descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', - data: { - // appId: this.envSrv.getEnvironment().appId, - }, - name: 'multipartFile', - multiple: false, - listType: 'picture-card', - change: (args) => { - if (args.type === 'success') { - this.checkIdCard(args.fileList[0].response.url, 1, 1); - } - }, - } as SFUploadWidgetSchema, - }, - name: { - title: '企业管理员姓名', - type: 'string', - maxLength: 8, - ui: { - width: 700, - placeholder: '请输入营业执照上的企业管理员姓名', - }, - }, - certificateNumber: { - title: '企业管理员身份证号', - type: 'string', - format: 'id-card', - minLength: 1, - maxLength: 18, - ui: { - width: 700, - placeholder: '请输入法定代表人身份证号码', - }, - }, - telephone: { - title: '企业管理员手机号', - type: 'string', - maxLength: 11, - format: 'mobile', - ui: { - placeholder: '请输入企业管理员手机号', - }, - }, - }, - required: ['contactsName'], - }; - this.schema1 = { - properties: { - title1: { - title: '', - type: 'string', - ui: { - widget: 'custom', - }, - }, - tips: { - title: '', - type: 'string', - ui: { - widget: 'custom', - offsetControl: 6, - }, - }, - enterpriseQualificationCertificate: { - type: 'string', - title: '营业执照', - ui: { - action: apiConf.fileUpload, - fileType: 'image/png,image/jpeg,image/jpg,image/gif', - fileSize: 5120, - limit: 1, - limitFileCount: 1, - resReName: 'url', - urlReName: 'url', - widget: 'upload', - descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', - data: { - // appId: this.envSrv.getEnvironment().appId, - }, - name: 'multipartFile', - multiple: false, - listType: 'picture-card', - change: (args) => { - if (args.type === 'success') { - this.checkBusinessLicense(args.fileList[0].response.url); - } - }, - } as SFUploadWidgetSchema, - }, - unifiedSocialCreditCode: { - title: '统一社会信用代码', - type: 'string', - minLength: 1, - maxLength: 18, - ui: { - width: 700, - optionalHelp: - '为了企业用户的使用体验,若公司代码即统一社会信用代码已在本应用其他关联平台注册,则此处填写的公司资料将同步更新至对应已注册的平台', - placeholder: '请输入营业执照上的统一社会信用代码', - errors: { - required: '请输入18位公司代码', - }, - }, - }, - enterpriseName: { - title: '公司名称', - type: 'string', - minLength: 2, - maxLength: 100, - ui: { - width: 700, - placeholder: '请输入公司名称', - errors: { - required: '请输入公司名称', - }, - }, - }, - enterpriseType: { - title: '公司类型', - type: 'string', - minLength: 1, - maxLength: 30, - ui: { - width: 700, - placeholder: '请输入公司类型', - errors: { - required: '请输入公司类型', - }, - }, - }, - region: { - type: 'number', - title: '营业执照所在地', - enum: this.regionData, - // default: [110000, 110100, 110105], - ui: { - width: 700, - widget: 'cascader', - valueProperty: 'regionCode', - labelProperty: 'name', - change: (ngModel: string | any[]) => { - const len = ngModel.length - 1; - this.enterpriseAddressCode = ngModel[len]; - // this.getRegionDetailByCode(ngModel[len],'name', 1); // 获取省市区名称 - }, - selectionChange: (values: NzCascaderOption[]) => { - // 获取省市区名称 - const len = values.length - 1; - this.enterpriseAddressCodeStr = values[len].regionFullName.split(',').reverse().join(''); - }, - }, - }, - enterpriseAddress: { - title: '营业执照详细地址', - type: 'string', - minLength: 1, - maxLength: 240, - ui: { - width: 700, - widget: 'textarea', - autosize: { minRows: 2, maxRows: 5 }, - placeholder: '请输入营业执照上的完整详细地址', - errors: { - required: '请输入营业执照上的完整详细地址', - }, - } as SFTextareaWidgetSchema, - }, - - title2: { - title: '', - type: 'string', - ui: { - widget: 'custom', - }, - }, - tipsC: { - title: '法定代表人证件照', - type: 'string', - ui: { - widget: 'custom', - // offsetControl: 6, - }, - }, - tipsA: { - title: '', - type: 'string', - ui: { - widget: 'custom', - offsetControl: 6, - }, - }, - certificatePhotoFront: { - type: 'string', - title: '', - ui: { - offsetControl: 6, - action: apiConf.fileUpload, - fileType: 'image/png,image/jpeg,image/jpg,image/gif', - fileSize: 5120, - limit: 1, - limitFileCount: 1, - resReName: 'url', - urlReName: 'url', - widget: 'upload', - descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', - data: { - // appId: this.envSrv.getEnvironment().appId, - }, - name: 'multipartFile', - multiple: false, - listType: 'picture-card', - change: (args) => { - if (args.type === 'success') { - this.checkIdCard(args.fileList[0].response.url, 0, 1); - } - }, - } as SFUploadWidgetSchema, - }, - tipsB: { - title: '', - type: 'string', - ui: { - widget: 'custom', - offsetControl: 6, - }, - }, - certificatePhotoBack: { - type: 'string', - title: '', - ui: { - offsetControl: 6, - action: apiConf.fileUpload, - fileType: 'image/png,image/jpeg,image/jpg,image/gif', - fileSize: 5120, - limit: 1, - limitFileCount: 1, - resReName: 'url', - urlReName: 'url', - widget: 'upload', - descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', - data: { - // appId: this.envSrv.getEnvironment().appId, - }, - name: 'multipartFile', - multiple: false, - listType: 'picture-card', - change: (args) => { - if (args.type === 'success') { - this.checkIdCard(args.fileList[0].response.url, 1, 1); - } - }, - } as SFUploadWidgetSchema, - }, - name: { - title: '法人姓名', - type: 'string', - maxLength: 8, - ui: { - width: 700, - placeholder: '请输入营业执照上的法人姓名', - }, - }, - region2: { - type: 'number', - title: '法人证件类型', - enum: this.regionData, - // default: [110000, 110100, 110105], - ui: { - width: 700, - widget: 'cascader', - valueProperty: 'regionCode', - labelProperty: 'name', - change: (ngModel: string | any[]) => { - const len = ngModel.length - 1; - this.enterpriseAddressCode = ngModel[len]; - // this.getRegionDetailByCode(ngModel[len],'name', 1); // 获取省市区名称 - }, - selectionChange: (values: NzCascaderOption[]) => { - // 获取省市区名称 - const len = values.length - 1; - this.enterpriseAddressCodeStr = values[len].regionFullName.split(',').reverse().join(''); - }, - }, - }, - certificateNumber: { - title: '法定代表人身份证号码', - type: 'string', - format: 'id-card', - minLength: 1, - maxLength: 18, - ui: { - width: 700, - placeholder: '请输入法定代表人身份证号码', - }, - }, - validStartTime: { - title: '身份证有效开始日期', - type: 'string', - ui: { - widget: 'date', - format: 'yyyy-MM-dd', - placeholder: '请选择', - errors: { - required: '请选择开始日期', - }, - change: (i) => { - // this.sf1?.setValue('/dateType1', false); - }, - } as SFDateWidgetSchema, - }, - validEndTime: { - title: '身份证有效截止日期', - type: 'string', - ui: { - widget: 'date', - format: 'yyyy-MM-dd', - placeholder: '请选择', - errors: { - required: '请选择截止日期', - }, - change: (i) => { - this.sf1?.setValue('/dateType1', false); - }, - } as SFDateWidgetSchema, - }, - dateType1: { - title: '长期', - type: 'boolean', - // enum: [{ label: '长期', value: true }], - ui: { - widget: 'checkbox', - change: (i) => this.longTime(i, 'schema11'), - } as SFCheckboxWidgetSchema, - }, - }, - required: [ - 'enterpriseQualificationCertificate', - 'unifiedSocialCreditCode', - 'enterpriseName', - 'enterpriseType', - 'region', - 'enterpriseAddress', - 'registrationCapital', - 'enterpriseRegistrationTime', - 'operatingEndTime', - 'operatingStartTime', - 'dateType', - 'businessScope', - 'certificatePhotoFront', - 'certificatePhotoBack', - 'name', - 'certificateNumber', - 'validStartTime', - 'validEndTime', - 'dateType1', - ], - }; - - this.ui = { - '*': { - spanLabelFixed: 180, - grid: { span: 24 }, - }, - $title1: { - spanLabelFixed: 0, - }, - $title99: { - spanLabelFixed: 0, - }, - $title2: { - spanLabelFixed: 0, - }, - $title3: { - spanLabelFixed: 0, - }, - $registrationCapital: { - spanLabelFixed: 180, - grid: { span: 11 }, - }, - $unit: { - spanLabelFixed: 100, - grid: { span: 6 }, - }, - }; - } - submitForm() { - - } - // submitForm() { - // // 营业执照基本信息 - // if (!this.sf.value.contactsName) { - // // this.service.msgSrv.warning('请填写申请人姓名'); - // return; - // } - // if (!this.sf1.value.enterpriseQualificationCertificate) { - // // this.service.msgSrv.warning('请上传营业执照'); - // return; - // } - // if (!this.sf1.value.unifiedSocialCreditCode) { - // // this.service.msgSrv.warning('请填写统一社会信用代码'); - // return; - // } - // if (!this.sf1.value.enterpriseName) { - // // this.service.msgSrv.warning('请填写公司名称'); - // return; - // } - // if (!this.sf1.value.enterpriseType) { - // // this.service.msgSrv.warning('请填写公司类型'); - // return; - // } - // if (!this.sf1.value.region) { - // // this.service.msgSrv.warning('请选择所在地区'); - // return; - // } - // if (!this.sf1.value.enterpriseAddress) { - // // this.service.msgSrv.warning('请填写营业执照详细地址'); - // return; - // } - // if (!this.sf1.value.registrationCapital) { - // // this.service.msgSrv.warning('请填写注册资本'); - // return; - // } - // if (!this.sf1.value.enterpriseRegistrationTime) { - // // this.service.msgSrv.warning('请选择成立日期'); - // return; - // } - // if (!this.sf1.value.operatingStartTime) { - // // this.service.msgSrv.warning('请选择营业期限开始日期'); - // return; - // } - // if (this.sf1.value.dateType !== true) { - // if (!this.sf1.value.operatingEndTime) { - // this.service.msgSrv.warning('请选择营业期限结束日期'); - // return; - // } - // if (this.sf1.value.operatingEndTime <= this.sf1.value.operatingStartTime) { - // this.service.msgSrv.warning('营业期限结束日期不能小于或等于开始日期'); - // return; - // } - // } - // if (!this.sf1.value.businessScope) { - // this.service.msgSrv.warning('请填写经营范围'); - // return; - // } - // if (!this.sf1.value.certificatePhotoFront) { - // this.service.msgSrv.warning('请上传身份证正面照'); - // return; - // } - // if (!this.sf1.value.certificatePhotoBack) { - // this.service.msgSrv.warning('请上传身份证反面照'); - // return; - // } - // if (!this.sf1.value.name) { - // this.service.msgSrv.warning('请填写法定代表人'); - // return; - // } - // if (!this.sf1.value.certificateNumber) { - // this.service.msgSrv.warning('请填写法定代表人身份证号'); - // return; - // } - // if (!this.sf1.value.validStartTime) { - // this.service.msgSrv.warning('请选择身份证有效开始日期'); - // return; - // } - // if (this.sf1.value.dateType1 !== true) { - // if (!this.sf1.value.validEndTime) { - // this.service.msgSrv.warning('请选择身份证有效截止日期'); - // return; - // } - // if (this.sf1.value.validEndTime <= this.sf1.value.validStartTime) { - // this.service.msgSrv.warning('身份证有效截止日期不能小于或等于开始日期'); - // return; - // } - // } - // const params: any = { - // contactsName: this.sf.value.contactsName, - // contactsPhone: this.sf.value.telephone, - // certificateNumber: this.sf1.value.certificateNumber, - // unifiedSocialCreditCode: this.sf1.value.unifiedSocialCreditCode, - // enterpriseAddressCodeStr: this.sf1.value.enterpriseAddressCodeStr, - // enterpriseAddressCode: this.sf1.value.region[2], - // enterpriseAddress: this.sf1.value.enterpriseAddress, - // enterpriseName: this.sf1.value.enterpriseName, - // enterpriseNameAbbreviation: this.sf1.value.enterpriseNameAbbreviation, - // enterpriseQualificationCertificate: this.sf1.value.enterpriseQualificationCertificate, - // enterpriseType: this.sf1.value.enterpriseType, - // enterpriseTelephone: this.sf1.value.enterpriseTelephone, - // enterpriseRegistrationTime: this.sf1.value.enterpriseRegistrationTime, - // businessScope: this.sf1.value.businessScope, - // operatingEndTime: this.sf1.value.operatingEndTime, - // operatingStartTime: this.sf1.value.operatingStartTime, - // organizationCode: this.sf1.value.organizationCode, - // registrationCapital: this.sf1.value.registrationCapital, - - // legalPersonIdentity: { - // // ...this.sf1.value, - // validStartTime: this.sf1.value.validStartTime, - // validEndTime: this.sf1.value.validEndTime, - // certificatePhotoBack: this.sf1.value.certificatePhotoBack, - // certificateNumber: this.sf1.value.certificateNumber, - // certificatePhotoFront: this.sf1.value.certificatePhotoFront, - // certificateType: this.sf1.value.certificateType, - // handCertificate: this.sf1.value.handCertificate, - // name: this.sf1.value.name, - // }, - // }; - // if (this.routerinfo.snapshot.queryParams.id) { - // params.id = this.routerinfo.snapshot.queryParams.id; - // } - // delete params?.tips; - // this.service.http.post(this.service.$api_supplierSubmitInfo, params).subscribe((res) => { - // if (res) { - // this.getApplicationInfo(res.data?.id); - // } - // }); - // } - getUserDetail() { - // this.service.http.post(this.service.$api_get_current_user_detail).subscribe((res) => { - // if (res) { - // this.infoData.telephone = res.data.phone; - // this.initSF(); - // } - // }); - } - - viewImg(image: any) { - // this.modal.createStatic(AccountComponentsImgViewComponent, { i: { imgUrl: image } }).subscribe(() => { - // // this.st.reload(); - // }); - } - getRegionToThree() { - // 获取一、二、三级地区详情 - // this.service.http.post(this.service.$api_getRegionToThree).subscribe((res) => { - // this.regionData = res.data; - // this.initSF(); - // }); - } - getApplicationInfo(id: string) { - // 查询申请信息详情 - const params: any = { - id, - }; - // this.service.http.post(this.service.$api_getSupplierEntryDetailInfo, params).subscribe((res) => { - // this.infoData.updateTime = res.data.updateTime; - // this.infoData.auditStatus = res.data.auditStatus; - // this.infoData.auditOpinion = res.data.auditOpinion; - // this.infoData1.contactsName = res.data.contactsName; - // this.infoData1.operationUserPhone = res.data.contactsPhone; - // this.infoData1.enterpriseName = res.data.enterpriseName; - // this.infoData1.unifiedSocialCreditCode = res.data.unifiedSocialCreditCode; - // this.infoData1.enterpriseType = res.data.enterpriseType; - // this.infoData1.registrationCapital = res.data.registrationCapital; - // this.infoData1.enterpriseRegistrationTime = res.data.operatingStartTime; - // this.infoData1.enterpriseRegistrationTime = res.data.operatingStartTime; - // this.infoData1.operatingStartTime = res.data.operatingStartTime; - // this.infoData1.operatingEndTime = res.data.operatingEndTime; - // this.infoData1.operatingEndTime = res.data.operatingEndTime; - // this.enterpriseAddressCodeStr = res.data.enterpriseAddressCodeStr; - // this.infoData1.enterpriseAddress = res.data.enterpriseAddress; - // this.infoData1.enterpriseBusinessAddress = res.data.enterpriseAddress; - // this.infoData1.businessScope = res.data.businessScope; - // this.infoData1.name = res.data.name; - // this.infoData1.certificateNumber = res.data.certificateNumber; - // this.infoData1.validStartTime = res.data.validStartTime; - // this.infoData1.validEndTime = res.data.validEndTime; - // this.infoData1.certificatePhotoFront = res.data.certificatePhotoFront; - // this.infoData1.enterpriseQualificationCertificate = res.data.enterpriseQualificationCertificate; - // this.infoData1.certificatePhotoBackurl = res.data.certificatePhotoBack; - // this.infoData1.certificatePhotoFronturl = res.data.certificatePhotoFront; - // this.infoData1.enterpriseQualificationCertificateurl = res.data.enterpriseQualificationCertificate; - - // this.infoData1.certificatePhotoBack = res.data.certificatePhotoBack; - // this.signingPeriod = res.data.signingPeriod; - // if (res.data) { - // // 申请人信息 - // this.infoData.certificatePhotoBack = [ - // { - // uid: -1, - // name: 'LOGO', - // status: 'done', - // url: res.data.certificatePhotoBack, - // response: { - // url: res.data.certificatePhotoBack, - // }, - // }, - // ]; - // this.infoData.certificatePhotoFront = [ - // { - // uid: -1, - // name: 'LOGO', - // status: 'done', - // url: res.data.certificatePhotoFront, - // response: { - // url: res.data.certificatePhotoFront, - // }, - // }, - // ]; - // if (!res.data.validEndTime) { - // this.infoData1.dateType1 = true; - // // this.sf.getProperty('/validStartTime').schema.readOnly = true; - // // this.sf.getProperty('/validEndTime').schema.readOnly = true; - // } - // } - // if (res.data) { - // // 营业执照基本信息 - // this.infoData1.enterpriseQualificationCertificate = [ - // { - // uid: -1, - // name: 'LOGO', - // status: 'done', - // url: res.data.enterpriseQualificationCertificate, - // response: { - // url: res.data.enterpriseQualificationCertificate, - // }, - // }, - // ]; - // this.infoData1.certificatePhotoFront = [ - // { - // uid: -1, - // name: 'LOGO', - // status: 'done', - // url: res.data.certificatePhotoFront, - // response: { - // url: res.data.certificatePhotoFront, - // }, - // }, - // ]; - // this.infoData1.certificatePhotoBack = [ - // { - // uid: -1, - // name: 'LOGO', - // status: 'done', - // url: res.data.certificatePhotoBack, - // response: { - // url: res.data.certificatePhotoBack, - // }, - // }, - // ]; - // this.infoData1.unifiedSocialCreditCode = res.data.unifiedSocialCreditCode; - // this.infoData1.enterpriseName = res.data.enterpriseName; - // this.infoData1.enterpriseType = res.data.enterpriseType; - // this.infoData1.enterpriseAddress = res.data.enterpriseAddress; - // // this.infoData1.enterpriseAddressCodeStr = res.data.businessLicenseJson.enterpriseAddressCodeStr; - // // this.infoData1.enterpriseBusinessAddressCodeStr = res.data.businessLicenseJson.enterpriseBusinessAddressCodeStr; - // this.infoData1.registrationCapital = res.data.registrationCapital; - // this.infoData1.enterpriseRegistrationTime = res.data.enterpriseRegistrationTime; - // this.infoData1.operatingStartTime = res.data.operatingStartTime; - // this.infoData1.operatingEndTime = res.data.operatingEndTime; - // this.infoData1.businessScope = res.data.businessScope; - // this.enterpriseAddressCodeStr = res.data.enterpriseAddressCodeStr; - // this.enterpriseAddressCode = +res.data.enterpriseAddressCode; - // this.getRegionDetailByCode(res.data.enterpriseAddressCode); - - // this.enterpriseBusinessAddressCodeStr = res.data.enterpriseBusinessAddressCodeStr; - // this.enterpriseBusinessAddressCode = res.data.enterpriseBusinessAddressCode; - // if (!res.data.operatingEndTime) { - // this.infoData1.dateType = true; - // } - // this.infoData.contactsName = res.data.contactsName; - // this.infoData.telephone = res.data.contactsPhone; - // } - - // if (res.data.auditStatus === 0 || res.data.auditStatus === 2 || res.data.auditStatus === 3) { - // // 1:待审核,2:复审,3:终审,5:已驳回 - // } else if (res.data.auditStatus === 1) { - // // 4:待签约 - // // this.getPdf(); - // // this.getEnterpriseInfo(this.id); - // } else if (res.data.auditStatus === 4) { - // // 6:已终止,7:已成功 - // this.step = 3; - // } - // this.initSF(); - // }); - } - getApplicationInfo2(id: string) { - // 查询申请信息详情 - const params: any = { - id, - }; - // this.service.http.post(this.service.$api_getSupplierEntryDetailInfo, params).subscribe((res) => { - // this.infoData.updateTime = res.data.updateTime; - // this.infoData.auditStatus = res.data.auditStatus; - // this.infoData.auditOpinion = res.data.auditOpinion; - // this.infoData1.contactsName = res.data.contactsName; - // this.infoData1.enterpriseName = res.data.enterpriseName; - // this.infoData1.unifiedSocialCreditCode = res.data.unifiedSocialCreditCode; - // this.infoData1.enterpriseType = res.data.enterpriseType; - // this.infoData1.registrationCapital = res.data.registrationCapital; - // this.infoData1.enterpriseRegistrationTime = res.data.operatingStartTime; - // this.infoData1.enterpriseRegistrationTime = res.data.operatingStartTime; - // this.infoData1.operatingStartTime = res.data.operatingStartTime; - // this.infoData1.operatingEndTime = res.data.operatingEndTime; - // this.infoData1.operatingEndTime = res.data.operatingEndTime; - // this.enterpriseAddressCodeStr = res.data.enterpriseAddressCodeStr; - // this.infoData1.enterpriseAddress = res.data.enterpriseAddress; - // this.infoData1.enterpriseBusinessAddress = res.data.enterpriseAddress; - // this.infoData1.businessScope = res.data.businessScope; - // this.infoData1.name = res.data.name; - // this.infoData1.certificateNumber = res.data.certificateNumber; - // this.infoData1.validStartTime = res.data.validStartTime; - // this.infoData1.validEndTime = res.data.validEndTime; - // this.infoData1.certificatePhotoFront = res.data.certificatePhotoFront; - // this.infoData1.enterpriseQualificationCertificate = res.data.enterpriseQualificationCertificate; - // this.infoData1.certificatePhotoBackurl = res.data.certificatePhotoBack; - // this.infoData1.certificatePhotoFronturl = res.data.certificatePhotoFront; - // this.infoData1.enterpriseQualificationCertificateurl = res.data.enterpriseQualificationCertificate; - - // this.infoData1.certificatePhotoBack = res.data.certificatePhotoBack; - // this.signingPeriod = res.data.signingPeriod; - // if (res.data) { - // // 申请人信息 - // this.infoData.certificatePhotoBack = [ - // { - // uid: -1, - // name: 'LOGO', - // status: 'done', - // url: res.data.certificatePhotoBack, - // response: { - // url: res.data.certificatePhotoBack, - // }, - // }, - // ]; - // this.infoData.certificatePhotoFront = [ - // { - // uid: -1, - // name: 'LOGO', - // status: 'done', - // url: res.data.certificatePhotoFront, - // response: { - // url: res.data.certificatePhotoFront, - // }, - // }, - // ]; - // if (!res.data.validEndTime) { - // this.infoData1.dateType = true; - // // this.sf.getProperty('/validStartTime').schema.readOnly = true; - // // this.sf.getProperty('/validEndTime').schema.readOnly = true; - // } - // } - // if (res.data) { - // // 营业执照基本信息 - // this.infoData1.enterpriseQualificationCertificate = [ - // { - // uid: -1, - // name: 'LOGO', - // status: 'done', - // url: res.data.enterpriseQualificationCertificate, - // response: { - // url: res.data.enterpriseQualificationCertificate, - // }, - // }, - // ]; - // this.infoData1.certificatePhotoFront = [ - // { - // uid: -1, - // name: 'LOGO', - // status: 'done', - // url: res.data.certificatePhotoFront, - // response: { - // url: res.data.certificatePhotoFront, - // }, - // }, - // ]; - // this.infoData1.certificatePhotoBack = [ - // { - // uid: -1, - // name: 'LOGO', - // status: 'done', - // url: res.data.certificatePhotoBack, - // response: { - // url: res.data.certificatePhotoBack, - // }, - // }, - // ]; - // this.infoData1.unifiedSocialCreditCode = res.data.unifiedSocialCreditCode; - // this.infoData1.enterpriseName = res.data.enterpriseName; - // this.infoData1.enterpriseType = res.data.enterpriseType; - // this.infoData1.enterpriseAddress = res.data.enterpriseAddress; - // // this.infoData1.enterpriseAddressCodeStr = res.data.businessLicenseJson.enterpriseAddressCodeStr; - // // this.infoData1.enterpriseBusinessAddressCodeStr = res.data.businessLicenseJson.enterpriseBusinessAddressCodeStr; - // this.infoData1.registrationCapital = res.data.registrationCapital; - // this.infoData1.enterpriseRegistrationTime = res.data.enterpriseRegistrationTime; - // this.infoData1.operatingStartTime = res.data.operatingStartTime; - // this.infoData1.operatingEndTime = res.data.operatingEndTime; - // this.infoData1.businessScope = res.data.businessScope; - // this.enterpriseAddressCodeStr = res.data.enterpriseAddressCodeStr; - // this.enterpriseAddressCode = +res.data.enterpriseAddressCode; - // this.getRegionDetailByCode(res.data.enterpriseAddressCode); - - // this.enterpriseBusinessAddressCodeStr = res.data.enterpriseBusinessAddressCodeStr; - // this.enterpriseBusinessAddressCode = res.data.enterpriseBusinessAddressCode; - // if (!res.data.operatingEndTime) { - // this.infoData1.dateType1 = true; - // } - // this.infoData.contactsName = res.data.contactsName; - // this.infoData.telephone = res.data.contactsPhone; - // this.infoData1.operationUserPhone = res.data.contactsPhone; - // } - // this.initSF(); - // }); - } - reloadApply() { - // 重新申请入驻 - this.modalService.confirm({ - nzTitle: '确定要重新申请入驻吗?', - nzContent: '当前申请已填写的资料将清空,重新申请需要重新填写资料', - nzOnOk: () => - new Promise((resolve, reject) => { - this.sf.reset(); - resolve(1); - }).catch(() => console.log('Oops errors!')), - }); - } - - updateBranchList(bankId: any, regionCode: any) { - // return this.service - // .loadBranchBankList(bankId, regionCode) - // .pipe( - // map((data) => { - // return data.map((m) => { - // return { label: m.branchName, value: m.branchCode }; - // }); - // }), - // ) - // .subscribe((res) => { - // // this.sf2.getProperty('/bankBranchName')!.schema.enum = res; - // // this.sf2.getProperty('/bankBranchName')!.widget.reset(res || res[0]); - // this.branchBanks = res || []; - // // this.initSF(); - // }); - } - loadBranchBanks(bankId: any, regionCode: any) { - // this.service - // .loadBranchBankList(bankId, regionCode) - // .pipe( - // map((data) => { - // return data.map((m) => { - // return { label: m.branchName, value: m.branchCode }; - // }); - // }), - // ) - // .subscribe((res: any[]) => { - // this.branchBanks = res || []; - // this.getUserDetail(); - this.loadBrandDist(); - this.updateBranchList(bankId, regionCode); - // }); - } - loadBrandDist() { - // this.service.http.post(this.service.$api_get_all_region).subscribe((res) => { - // const data = res.data; - // data.forEach((item: { children: any[] }) => { - // item.children.forEach((element: { isLeaf: boolean }) => { - // element.isLeaf = true; - // }); - // }); - // // this.sf2.getProperty('/bankAreaArr').schema.enum = data; - // // this.sf2.getProperty('/bankAreaArr').widget.reset(data); - // this.bankRegion = data; - // this.initSF(); - // }); - } - - getProvinceData() { - // return this.service.http.post(this.service.$api_getRegionByCode, { regionCode: '' }).pipe( - // map((res) => { - // return res.data.map((m: { name: any; regionCode: any }) => { - // return { label: m.name, value: m.regionCode }; - // }); - // }), - // ); - } - updateArea(parentId: string, target: string, type: number, nextTarget: string, sfObj: SFComponent): any { - // 改变二级数据时,同时清空三级数据 - if (type === 2 && sfObj) { - sfObj.getProperty(nextTarget)!.schema.enum = []; - sfObj.getProperty(nextTarget)!.widget.reset([]); - sfObj.getProperty(nextTarget)!.setValue(null, true); - } - - if (!parentId && sfObj) { - sfObj.getProperty(target)!.schema.enum = []; - sfObj.getProperty(target)!.widget.reset([]); - sfObj.getProperty(target)!.setValue(null, true); - } else { - // return this.service.http - // .get(this.service.$api_getRegionByCode, { regionCode: parentId }) - // .pipe( - // map((res) => { - // return res.data.map((m: { regionFullName: string; name: any; regionCode: any }) => { - // const fullName = m.regionFullName.split(',').reverse().join(''); - // return { label: m.name, value: m.regionCode, fullName }; - // }); - // }), - // ) - // .subscribe((res) => { - // sfObj.getProperty(target)!.schema.enum = res; - // sfObj.getProperty(target)!.widget.reset(res); - // }); - } - } - getCategoryList() { - // return this.service.http.post(this.service.$api_getCategoryList, { id: '' }).pipe( - // map((data) => { - // return data.data.map((m: { name: any; id: any }) => { - // return { label: m.name, value: m.id }; - // }); - // }), - // ); - // .subscribe((res) => { - // this.sf3.getProperty('/classify').schema.enum = res; - // this.sf3.getProperty('/classify').widget.reset(res || res[0]); - // }); - } - getEnterpriseInfo(id: any) { - // 查询企业信息详情 - const params: any = { - id, - }; - // this.service.http.post(this.service.$api_getEnterpriseInfo, params).subscribe((res) => { - // this.signingPeriod = res.data.signingPeriod; - // }); - } - - - - auditSupplier(contractNo: any) { - // 审核供应商,签署成功需要调此接口 - const params = { - auditStatus: 7, - id: this.id, - contractNum: contractNo, - }; - // this.service.request(this.service.$api_auditSupplier, params).subscribe((res) => { - // this.service.msgSrv.success('签署成功!'); - // this.step = 3; - // this.infoData.auditStatus = 7; - // }); - } - cancel(): void { - this.msg.info('已取消'); - } - /* - * 根据地区code查询地区详情 - * code:请求参数 - * type:参数 name:获取省市区名称,fullcode:获取省市区code - * num:参数 1:第一个地区选择,2:第二个地区选择 - */ - getRegionDetailByCode(code: any) { - // 根据地区code查询地区详情 - // this.service.http.post(this.service.$api_getRegionDetailByCode, { regionCode: code }).subscribe((res) => { - // // 供选择地区保存-获取省市区名称 - // // 第二个地区选择 - - // const a = res.data.regionFullCodes.split(','); - - // this.sf1?.setValue('/region', [+a[0], +a[1], +a[2]]); - // this.enterpriseBusinessAddressCodeStr = res.data.regionFullName.replace(/,/g, ''); - // }); - } - longTime(i: boolean | SFSchemaEnum[], type: string) { - if (type === 'schema') { - if (i) { - // this.sf?.setValue('/validStartTime', Date); - this.sf?.setValue('/validEndTime', Date); - // this.sf.getProperty('/validStartTime').schema.readOnly = true; - this.sf.getProperty('/validEndTime')!.schema.readOnly = true; - } else { - // this.sf.getProperty('/validStartTime').schema.readOnly = false; - this.sf.getProperty('/validEndTime')!.schema.readOnly = false; - } - } - if (type === 'schema1') { - if (i) { - // this.sf1?.setValue('/operatingStartTime', Date); - this.sf1?.setValue('/operatingEndTime', Date); - // this.sf1.getProperty('/operatingStartTime').schema.readOnly = true; - this.sf1.getProperty('/operatingEndTime')!.schema.readOnly = true; - } else { - // this.sf1.getProperty('/operatingStartTime').schema.readOnly = false; - this.sf1.getProperty('/operatingEndTime')!.schema.readOnly = false; - } - } - if (type === 'schema11') { - if (i) { - // this.sf1?.setValue('/validStartTime', Date); - this.sf1?.setValue('/validEndTime', Date); - // this.sf1.getProperty('/validStartTime').schema.readOnly = true; - this.sf1.getProperty('/validEndTime')!.schema.readOnly = true; - } else { - // this.sf1.getProperty('/validStartTime').schema.readOnly = false; - this.sf1.getProperty('/validEndTime')!.schema.readOnly = false; - } - } - } - prev() { - // 返回上一步 - if (this.subStep > 0) { - this.subStep--; - } - if (this.subStep === 2) { - if (this.id) { - this.loadBranchBanks(this.infoData2.bankCode, this.infoData2.bankAddressCode); - } else { - this.loadBrandDist(); - } - } - } - clearData() { - // 重新申请 - const params: any = { - id: this.id, - }; - // this.service.request(this.service.$api_deleteApplyCache, params).subscribe((res) => { - // if (res) { - // this.service.msgSrv.success('已清除申请资料,请重新申请!'); - // this.edit(); - // this.id = ''; - // this.infoData = {}; - // this.infoData1 = {}; - // this.infoData2 = { - // accountName: '', - // }; - // this.infoData3 = {}; - // } - // }); - } - edit() { - this.subStep = 0; - this.getApplicationInfo2(this.routerinfo.snapshot.queryParams.id); - } - goPage(page: string) { - if (page === 'list') { - this.router.navigate(['./account/role']); - } else { - this.router.navigate(['./account/apply-list']); - } - } - goBack() { - window.history.go(-1); - } - onChange(result: Date): void {} - refreshPage() { - window.location.reload(); - } - checkIdCard(imgurl: any, isFront: number, type: number) { - // 识别身份证 参数isFront:0-正面、1-背面;type:0-申请人身份证,1-法定代表人身份证 - const params = { - idCardImagePath: imgurl, - isFront, - }; - // this.service.request(this.service.$api_checkIdCard, params).subscribe((res) => { - // if (res) { - // if (type === 0) { - // // 申请人身份证 - // if (isFront === 0) { - // // 正面 - // if (res.name) { - // this.sf.setValue('/name', res.name); - // } - // if (res.idCardNumber) { - // this.sf.setValue('/certificateNumber', res.idCardNumber); - // } - // } - // if (isFront === 1) { - // // 背面 - // if (res.validFrom) { - // this.sf.setValue('/validStartTime', res.validFrom); - // } - // if (res.validTo) { - // this.sf.setValue('/validEndTime', res.validTo); - // } - // } - // } - // if (type === 1) { - // // 法定代表人身份证 - // if (isFront === 0) { - // // 正面 - // if (res.name) { - // this.sf1.setValue('/name', res.name); - // } - // if (res.idCardNumber) { - // this.sf1.setValue('/certificateNumber', res.idCardNumber); - // } - // } - // if (isFront === 1) { - // // 背面 - // if (res.validFrom) { - // this.sf1.setValue('/validStartTime', res.validFrom); - // } - // if (res.validTo) { - // this.sf1.setValue('/validEndTime', res.validTo); - // } - // } - // } - // } - // }); - } - checkBusinessLicense(imgurl: any) { - // 识别营业执照 - const params = { - licenseImagePath: imgurl, - }; - // this.service.request(this.service.$api_checkBusinessLicense, params).subscribe((res) => { - // if (res) { - // if (res.unifiedSocialCreditCode) { - // this.sf1.setValue('/unifiedSocialCreditCode', res.unifiedSocialCreditCode); - // } - // if (res.enterpriseName) { - // this.sf1.setValue('/enterpriseName', res.enterpriseName); - // } - // if (res.enterpriseType) { - // this.sf1.setValue('/enterpriseType', res.enterpriseType); - // } - // if (res.addressRegionCodes) { - // this.sf1.setValue('/region', res.addressRegionCodes); - // } - // if (res.address) { - // this.sf1.setValue('/enterpriseAddress', res.address); - // } - // if (res.foundDate) { - // this.sf1.setValue('/enterpriseRegistrationTime', res.foundDate); - // } - // if (res.registeredCapital) { - // this.sf1.setValue('/registrationCapital', res.registeredCapital); - // } - // if (res.businessTermStartDate) { - // this.sf1.setValue('/operatingStartTime', res.businessTermStartDate); - // } - // if (res.businessTermEndDate) { - // this.sf1.setValue('/operatingEndTime', res.businessTermEndDate); - // } - // if (res.businessScope) { - // this.sf1.setValue('/businessScope', res.businessScope); - // } - // const len = res.addressRegionCodes.length - 1; - // this.enterpriseAddressCode = res.addressRegionCodes[len]; - // this.enterpriseAddressCodeStr = res.addressRegionNames; - // if (!res.businessTermEndDate) { - // this.sf1.setValue('/dateType', true); - // } - // } - // }); - } - - // resetForm(): void { - // this.infoData.reset(); - // } -} diff --git a/src/app/routes/usercenter/components/freight/user/user.component.html b/src/app/routes/usercenter/components/freight/user/user.component.html index b0d2de52..de558bcf 100644 --- a/src/app/routes/usercenter/components/freight/user/user.component.html +++ b/src/app/routes/usercenter/components/freight/user/user.component.html @@ -1,13 +1,13 @@ - + @@ -33,10 +33,9 @@
- - + + + + + + +
+ + + +
确定冻结该企业吗?
+
+ 停用后,该企业将被限制使用,不限于访问受限、无法发布货源等,请谨慎操作 +
+
+
+ + + + +
+ + +
+ + + +
确定启用该企业吗?
+
+ 启用后,该企业将恢复正常使用功能,请再次确认 +
+
+
+ + + + +
+ diff --git a/src/app/routes/usercenter/components/freight/user/user.component.ts b/src/app/routes/usercenter/components/freight/user/user.component.ts index 28210434..d156e00f 100644 --- a/src/app/routes/usercenter/components/freight/user/user.component.ts +++ b/src/app/routes/usercenter/components/freight/user/user.component.ts @@ -11,10 +11,15 @@ import { UsermanageService } from '../../../services/usercenter.service'; export class FreightComponentsUserComponent implements OnInit { _$expand = false; url = `/rule?_allow_anonymous=true`; - + isVisible = false; + isVisibleFreeze = false; + isVisibleOpen = false; ui!: SFUISchema; + ui2!: SFUISchema; schema!: SFSchema; + schema2!: SFSchema; columns!: STColumn[]; + suppliersData: any; datalist = [ { storeName: '企业名称', @@ -45,6 +50,7 @@ export class FreightComponentsUserComponent implements OnInit { ] @ViewChild('st', { static: false }) st!: STComponent; @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sf2', { static: false }) sf2!: SFComponent; constructor(public service: UsermanageService, private modal: NzModalService, private router: Router, private ar: ActivatedRoute) {} /** @@ -77,6 +83,7 @@ export class FreightComponentsUserComponent implements OnInit { ngOnInit() { this.initSF(); this.initST(); + this.initSF2(); this.ar.url.subscribe((params) => { this.st?.load(1); }); @@ -96,19 +103,21 @@ export class FreightComponentsUserComponent implements OnInit { hidden: true, }, }, - storeName: { title: '企业名称', type: 'string', ui: { showRequired: false } }, + storeName: { title: '用户姓名', type: 'string', ui: { showRequired: false } }, contactsName: { - title: '联系人', + title: '企业名称', type: 'string', ui: { showRequired: false, }, }, - unifiedSocialCreditCode: { - title: '税源地', + phone: { + title: '手机号', type: 'string', + format: 'mobile', + maxLength: 11, ui: { - showRequired: false, + placeholder: '请输入手机号', }, }, enStatus: { @@ -128,18 +137,13 @@ export class FreightComponentsUserComponent implements OnInit { }, }, }, - enStatus2: { + yewuphone: { + title: '业务员手机号', type: 'string', - title: 'CRM审核状态', - enum: [ - { label: '全部', value: '' }, - { label: '正常', value: 0 }, - { label: '冻结', value: 1 }, - { label: '废弃', value: 2 }, - ], - default: '', + format: 'mobile', + maxLength: 11, ui: { - widget: 'select', + placeholder: '请输入手机号', visibleIf: { expand: (value: boolean) => value, }, @@ -147,29 +151,38 @@ export class FreightComponentsUserComponent implements OnInit { }, }, }; - this.ui = { '*': { spanLabelFixed: 90, grid: { span: 8, gutter: 4 }, enter: () => this.st.load() } }; + this.ui = { '*': { spanLabelFixed: 180, grid: { span: 8, gutter: 4 }, enter: () => this.st.load() } }; + } + initSF2() { + this.schema2 = { + properties: { + phone: { + title: '手机号', + type: 'string', + format: 'mobile', + maxLength: 11, + ui: { + placeholder: '请输入手机号', + }, + }, + }, + }; + this.ui2 = { '*': { spanLabelFixed: 90, grid: { span: 16}, enter: () => this.st.load() } }; } initST() { this.columns = [ // { title: '', type: 'checkbox', className: 'text-center' }, - { title: '企业名称', className: 'text-center', index: 'storeName' }, - { title: '联系人', className: 'text-center', index: 'contactsName' }, - { title: '税源地', className: 'text-center', render: 'enterpriseName' }, - { title: '累计运单金额', className: 'text-center', index: 'unifiedSocialCreditCode' }, - { title: '道运证', className: 'text-center', index: 'contactsPhone', + { title: '用户姓名', className: 'text-center', index: 'storeName' }, + { title: '手机号', className: 'text-center', index: 'contactsName' }, + { title: '身份证件号', className: 'text-center', render: 'enterpriseName' }, + { title: '常用服务', className: 'text-center', index: 'unifiedSocialCreditCode' }, + { title: '推广业务员', className: 'text-center', index: 'contactsPhone', render: 'contactsPhone' }, - { title: '企业状态', className: 'text-center', index: 'effectiveDateStr', - type: 'badge', - badge: { - 正常: { text: '正常', color: 'success' }, - 冻结: { text: '冻结', color: 'warning' }, - 废弃: { text: '废弃', color: 'default' }, - }, - }, + { title: '申请时间', className: 'text-center', index: 'unifiedSocialCreditCode2' }, { - title: 'CRM审核状态', + title: '状态', className: 'text-center', index: 'enStatusStr2', type: 'badge', @@ -179,19 +192,6 @@ export class FreightComponentsUserComponent implements OnInit { 废弃: { text: '废弃', color: 'default' }, }, }, - { - title: '代收权限', - className: 'text-center', - index: 'enStatusStr3', - type: 'badge', - badge: { - 正常: { text: '正常', color: 'success' }, - 冻结: { text: '冻结', color: 'warning' }, - 废弃: { text: '废弃', color: 'default' }, - }, - }, - { title: '常用服务', className: 'text-center', index: 'unifiedSocialCreditCode3' }, - { title: '推广业务员', className: 'text-center', index: 'unifiedSocialCreditCode2' }, { title: '操作', width: '170px', @@ -200,8 +200,20 @@ export class FreightComponentsUserComponent implements OnInit { { text: '查看', click: (item) => { - this.router.navigate(['./detail', item.tenantId], { relativeTo: this.ar }); - // this.router.navigate(['./view', item.id], { relativeTo: this.ar, queryParams: { tenantId: item.tenantId } }); + this.router.navigate(['./view', item.tenantId], { relativeTo: this.ar }); + }, + }, + { + text: '冻结', + click: (item) => { + this.isVisibleFreeze = true + }, + }, + { + text: '启用', + click: (item) => { + this.isVisibleOpen = false + console.log(item) }, }, ], @@ -209,7 +221,7 @@ export class FreightComponentsUserComponent implements OnInit { ]; } daoyun(item: any) { - this.router.navigate(['./view', item.tenantId], { relativeTo: this.ar }); + this.isVisible = true } expandToggle() { this._$expand = !this._$expand; @@ -225,4 +237,16 @@ export class FreightComponentsUserComponent implements OnInit { this.sf.reset(); this._$expand = false; } + handleOK() { + console.log(this.sf2.value) + } + handleCancel() { + this.isVisible = false + } + handleCancel_open() { + this.isVisibleOpen = false + } + handleCancel_freeze() { + this.isVisibleFreeze = false + } } diff --git a/src/app/routes/usercenter/components/freight/user/view/view.component.html b/src/app/routes/usercenter/components/freight/user/view/view.component.html deleted file mode 100644 index 96d0bc91..00000000 --- a/src/app/routes/usercenter/components/freight/user/view/view.component.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - -

道路运输经营许可证

- -
- - -
-
-
- - diff --git a/src/app/routes/usercenter/components/freight/user/view/view.component.less b/src/app/routes/usercenter/components/freight/user/view/view.component.less deleted file mode 100644 index 48f605d9..00000000 --- a/src/app/routes/usercenter/components/freight/user/view/view.component.less +++ /dev/null @@ -1,46 +0,0 @@ -@import '~@delon/theme/index'; -:host { - ::ng-deep { - .ant-steps-dot { - .ant-steps-item-content { - width: 200px; - } - .ant-steps-item-icon { - margin-left: 96px; - } - .ant-steps-item-tail::after { - margin-left: 40px; - } - } - .success { - color: @success-color; - } - - .warning { - color: @warning-color; - } - - .error { - color: @error-color; - } - } - .mt16 { - margin-top: 16px; - } - .user-info { - display: flex; - font-size: 16px; - .enterprise-name { - margin-right: 15px; - } - img { - width: 64px; - height: 64px; - margin-right: 15px; - border-radius: 50%; - } - .user-info-des { - margin-bottom: 5px; - } - } -} diff --git a/src/app/routes/usercenter/components/freight/user/view/view.component.spec.ts b/src/app/routes/usercenter/components/freight/user/view/view.component.spec.ts deleted file mode 100644 index 6e2a7782..00000000 --- a/src/app/routes/usercenter/components/freight/user/view/view.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FreightComponentsListViewComponent } from './view.component'; - -describe('FreightComponentsListViewComponent', () => { - let component: FreightComponentsListViewComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [FreightComponentsListViewComponent], - }).compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(FreightComponentsListViewComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/routes/usercenter/components/freight/user/view/view.component.ts b/src/app/routes/usercenter/components/freight/user/view/view.component.ts deleted file mode 100644 index f72bb40a..00000000 --- a/src/app/routes/usercenter/components/freight/user/view/view.component.ts +++ /dev/null @@ -1,257 +0,0 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { STColumn, STComponent } from '@delon/abc/st'; -import { ModalHelper, _HttpClient } from '@delon/theme'; -import { NzMessageService } from 'ng-zorro-antd/message'; -import { UsermanageService } from '../../../../services/usercenter.service'; -import { SFComponent, SFSchema, SFDateWidgetSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form'; -import { Observable, Observer } from 'rxjs'; -@Component({ - selector: 'app-Freight-components-list-view', - templateUrl: './view.component.html', - styleUrls: ['./view.component.less'], -}) -export class FreightComponentsListViewComponent implements OnInit { - i: any; - url = `/rule?_allow_anonymous=true`; - - @ViewChild('st', { static: false }) st!: STComponent; - detailData: any = { - status: 0 - }; - isShow = false; - isVisible = false; - modalTitle = '有效期'; - modalName = ''; - ui!: SFUISchema; - schema!: SFSchema; - @ViewChild('sf', { static: false }) sf!: SFComponent; - @ViewChild('sf1', { static: false }) sf1!: SFComponent; - validData: any = ['FreightsType']; - FreightsData: any = {}; - - constructor( - private http: _HttpClient, - private modal: ModalHelper, - public service: UsermanageService, - private route: ActivatedRoute, - private modalHelper: ModalHelper, - private msgSrv: NzMessageService, - ) {} - - ngOnInit() { - console.log(this.route.snapshot); - this.initData(); - this.initSF(); - // this.launchSign(); - } - /** - * 初始化查询表单 - */ - initSF() { - this.schema = { - properties: { - name: { - title: '许可证号', - type: 'string', - maxLength: 20, - ui: { - placeholder: '请输入角色名称', - }, - }, - phone: { - title: '业户名称', - type: 'string', - maxLength: 20, - ui: { - placeholder: '请输入业户名称', - }, - }, - roleDescription: { - title: '地址', - type: 'string', - maxLength: 30, - ui: { - placeholder: '请输入地址', - widget: 'textarea', - }, - }, - effectiveDate: { - title: '发证日期', - type: 'string', - ui: { - widget: 'date', - format: 'yyyy-MM-dd 00:00:00', - // hidden: this.modalName === 'effectiveDate' ? false : true, - } as SFDateWidgetSchema, - }, - phone3: { - title: '有效期', - type: 'string', - ui: { - placeholder: '请输入业户名称', - }, - }, - phone4: { - title: '有效期截止', - type: 'string', - ui: { - placeholder: '请输入业户名称', - }, - }, - phone5: { - title: '经营范围', - type: 'string', - ui: { - placeholder: '请输入业户名称', - }, - }, - avatar: { - type: 'string', - title: '证照', - ui: { - // action: environment.UPLOAD_URL, - fileType: 'image/png,image/jpeg,image/jpg,image/png,image/gif,image/bmp', - limit: 1, - limitFileCount: 1, - resReName: 'url', - urlReName: 'url', - widget: 'upload', - descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', - data: { - // appId: environment.appId, - }, - name: 'multipartFile', - multiple: false, - listType: 'picture-card', - change: (args) => { - if (args.type === 'success') { - const avatar = [ - { - uid: -1, - name: 'LOGO', - status: 'done', - url: args.fileList[0].response.url, - response: { - url: args.fileList[0].response.url, - }, - }, - ]; - this.sf?.setValue('/avatar', avatar); - } - }, - beforeUpload: (file: any, _fileList) => { - return new Observable((observer: Observer) => { - const isLt2M = file.size / 1024 / 1024 < 5; - if (!isLt2M) { - this.service.msgSrv.warning('图片大小超过5M!'); - observer.complete(); - return; - } - observer.next(isLt2M); - observer.complete(); - }); - }, - } as SFUploadWidgetSchema, - }, - }, - required: ['name', 'phone'], - }; - this.ui = { '*': { spanLabelFixed: 200, grid: {offset:4, span: 12 } } }; - } - showModal(name: any) { - this.modalName = name; - if (name === 'effectiveDate') { - this.isShow = true; - } else { - this.isVisible = true; - } - } - async initData() { - console.log(this.route.snapshot, 'this.route.snapshot'); - - const params = { - tenantId: this.route.snapshot.params.id, - }; - } - - /** - * 根据地区code查询地区详情 - * @param code 地区代码 - */ - async getRegionFullName(code: any) { - const params = { - regionCode: code, - }; - const res = await this.service.asyncRequest(this.service.$api_get_region_detailByCode, params, 'POST', true); - // if (res && res.regionFullName) { - // const arr = res.regionFullName.split(','); - // res.regionFullName = arr.reverse().join('-'); - // } - return res && res.regionFullName; - } - add() { - // this.modal - // .createStatic(FormEditComponent, { i: { id: 0 } }) - // .subscribe(() => this.st.reload()); - } - goBack() { - window.history.go(-1); - } - /** - * 冻结 - */ - freezeOrResume(type: number) { - this.service.http - .post(this.service.$api_set_freezeOrResume, { - tenantId: this.route.snapshot.params.id, - // tenantId: this.route.snapshot.queryParams.tenantId, - status: type, - }) - .subscribe((res) => { - if (res.data === true) { - if (type === 0) { - this.service.msgSrv.success(`启用成功!`); - } else if (type === 1) { - this.service.msgSrv.success(`冻结成功!`); - } - this.ngOnInit(); - } else { - this.service.msgSrv.error(res.msg || '操作失败!'); - } - }); - } - - handleCancel(name: any) { - if (name === 'effectiveDate') { - this.isShow = false; - } else { - this.isVisible = false; - } - } - handleOK(name: any) { - const params: any = { - tenantId: this.route.snapshot.params.id, - // tenantId: this.route.snapshot.queryParams.tenantId, - }; - - if (name === 'effectiveDate') { - params.effectiveDate = this.sf?.value?.effectiveDate; - } else { - Object.assign(params, this.sf1?.value); - } - this.service.http.post(this.service.$api_set_freezeOrResume, params).subscribe((res) => { - if (res.data === true) { - this.service.msgSrv.success(`编辑成功!`); - this.ngOnInit(); - } else { - this.service.msgSrv.error(res.msg || '编辑失败!'); - } - if (name === 'effectiveDate') { - this.isShow = false; - } else { - this.isVisible = false; - } - }); - } -} diff --git a/src/app/routes/usercenter/usercenter-routing.module.ts b/src/app/routes/usercenter/usercenter-routing.module.ts index ca4cb7bd..df1ef699 100644 --- a/src/app/routes/usercenter/usercenter-routing.module.ts +++ b/src/app/routes/usercenter/usercenter-routing.module.ts @@ -1,7 +1,7 @@ /* * @Author: your name * @Date: 2021-11-29 15:22:34 - * @LastEditTime: 2021-11-30 15:12:16 + * @LastEditTime: 2021-11-30 15:55:44 * @LastEditors: Please set LastEditors * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: \tms-obc-web\src\app\routes\usercenter\usercenter-routing.module.ts @@ -15,6 +15,7 @@ import { FreightComponentsListDetailComponent } from './components/freight/list/ import { FreightComponentsListComponent } from './components/freight/list/list.component'; import { FreightComponentsListNewComponent } from './components/freight/list/new/new.component'; import { FreightComponentsListViewComponent } from './components/freight/list/view/view.component'; +import { FreightComponentsUserDetailComponent } from './components/freight/user/detail/detail.component'; import { FreightComponentsUserComponent } from './components/freight/user/user.component'; @@ -27,6 +28,7 @@ const routes: Routes = [ { path: 'freight/enterprise', component: FreightComponentsEnterpriseAuditComponent }, { path: 'freight/enterprise/view/:id', component: FreightComponentsEnterpriseAuditViewComponent }, { path: 'freight/user', component: FreightComponentsUserComponent }, + { path: 'freight/user/view/:id', component: FreightComponentsUserDetailComponent }, ]; @NgModule({ diff --git a/src/app/routes/usercenter/usercenter.module.ts b/src/app/routes/usercenter/usercenter.module.ts index 6a275546..14677a6d 100644 --- a/src/app/routes/usercenter/usercenter.module.ts +++ b/src/app/routes/usercenter/usercenter.module.ts @@ -14,6 +14,7 @@ import { FreightComponentsListDetailComponent } from './components/freight/list/ import { FreightComponentsListComponent } from './components/freight/list/list.component'; import { FreightComponentsListNewComponent } from './components/freight/list/new/new.component'; import { FreightComponentsListViewComponent } from './components/freight/list/view/view.component'; +import { FreightComponentsUserDetailComponent } from './components/freight/user/detail/detail.component'; import { FreightComponentsUserComponent } from './components/freight/user/user.component'; import { UsercenterRoutingModule } from './usercenter-routing.module'; @@ -24,7 +25,8 @@ const COMPONENTS = [ FreightComponentsListDetailComponent, FreightComponentsEnterpriseAuditComponent, FreightComponentsEnterpriseAuditViewComponent, - FreightComponentsUserComponent + FreightComponentsUserComponent, + FreightComponentsUserDetailComponent ]; @NgModule({ diff --git a/src/assets/mocks/menu-data.json b/src/assets/mocks/menu-data.json index cd533255..52853792 100644 --- a/src/assets/mocks/menu-data.json +++ b/src/assets/mocks/menu-data.json @@ -73,7 +73,7 @@ { "text": "用户列表", "icon": "anticon anticon-dashboard", - "link": "/usercenter/user" + "link": "/usercenter/freight/user" } ] } From db7426089f39ebe261a32bd91fdcb67a5518da74 Mon Sep 17 00:00:00 2001 From: wangshiming Date: Tue, 30 Nov 2021 16:24:00 +0800 Subject: [PATCH 0011/1600] fix bug --- .../freight/user/detail/detail.component.html | 273 ++---------------- .../freight/user/detail/detail.component.ts | 9 + 2 files changed, 36 insertions(+), 246 deletions(-) diff --git a/src/app/routes/usercenter/components/freight/user/detail/detail.component.html b/src/app/routes/usercenter/components/freight/user/detail/detail.component.html index 4aafe892..e482b927 100644 --- a/src/app/routes/usercenter/components/freight/user/detail/detail.component.html +++ b/src/app/routes/usercenter/components/freight/user/detail/detail.component.html @@ -1,6 +1,14 @@ + - + - - - + left: 85%;"> + 状态 +
+ 待审核
- - - -
- - - -
确定冻结该企业吗?
-
- 停用后,该企业将被限制使用,不限于访问受限、无法发布货源等,请谨慎操作 -
-
-
- -
- - - -
确定启用该企业吗?
-
- 启用后,该企业将恢复正常使用功能,请再次确认 -
-
-
- -
- - - -
确定关闭该企业支付权限吗?
-
- 停用后,该企业将被限制使用支付功能,请谨慎操作 -
-
-
- -
- - - -
确定开通该企业支付权限吗?
-
- 启用后,该企业将恢复正常支付功能,请再次确认 -
-
-
- - 联系信息人 - + + 申请人信息 + {{ detailData?.contactsName }} - - {{ detailData?.contactsPhone }} - - + {{ detailData?.contactsPhone }} + + + - 公司基本信息 - - {{ detailData?.enterpriseName }} - - - {{ detailData?.unifiedSocialCreditCode }} - - - {{ detailData?.enterpriseType }} - - - {{ detailData?.registrationCapital }} - 万元 - - - {{ detailData?.enterpriseRegistrationTime }} - - -
- {{ detailData?.operatingStartTime }} 至 {{ detailData?.operatingEndTime }} -
-
长期
-
{{ detailData?.operatingStartTime }} 至 长期
-
-
- - - {{ detailData?.enterpriseAddressCodeStr }} - - - {{ detailData?.enterpriseAddress }} - - - - - {{ detailData?.enterpriseAddressCodeStr }} - - - {{ detailData?.enterpriseAddress }} - - - - - {{ detailData?.enterpriseAddressCodeStr }} - - - {{ detailData?.enterpriseAddress }} - - - - - {{ detailData?.businessScope }} - - - - - - - - 法人信息 - - {{ detailData?.name }} - - - {{ detailData?.certificateNumber }} - - - {{ detailData?.validStartTime }} - - {{ detailData?.validEndTime ? detailData?.validEndTime : '长期' }} - - - - - - - - 银行结算信息 - - {{ detailData?.name }} - - - {{ detailData?.certificateNumber }} - - - {{ detailData?.validStartTime }} - + 关联企业 + +
diff --git a/src/app/routes/usercenter/components/freight/user/detail/detail.component.ts b/src/app/routes/usercenter/components/freight/user/detail/detail.component.ts index ba6984d0..c9306724 100644 --- a/src/app/routes/usercenter/components/freight/user/detail/detail.component.ts +++ b/src/app/routes/usercenter/components/freight/user/detail/detail.component.ts @@ -252,4 +252,13 @@ export class FreightComponentsUserDetailComponent implements OnInit { } }); } + auditPass() { + + } + auditNo() { + + } + ratify() { + + } } From fc86bb36c5d743b3fdcda297b48fe2f6b29899c5 Mon Sep 17 00:00:00 2001 From: wangshiming Date: Tue, 30 Nov 2021 17:26:27 +0800 Subject: [PATCH 0012/1600] fix bug --- .../driver/detail/detail.component.html | 289 ++++ .../driver/detail/detail.component.less | 46 + .../driver/detail/detail.component.spec.ts | 31 + .../driver/detail/detail.component.ts | 255 +++ .../components/driver/driver.component.html | 84 + .../driver/driver.component.spec.ts | 31 + .../components/driver/driver.component.ts | 228 +++ .../components/driver/new/new.component.html | 109 ++ .../components/driver/new/new.component.less | 109 ++ .../components/driver/new/new.component.ts | 1400 +++++++++++++++++ .../driver/view/view.component.html | 49 + .../driver/view/view.component.less | 46 + .../driver/view/view.component.spec.ts | 23 + .../components/driver/view/view.component.ts | 257 +++ .../freight/user/detail/detail.component.html | 16 +- .../freight/user/detail/detail.component.ts | 21 +- .../components/freight/user/user.component.ts | 2 +- .../usercenter/usercenter-routing.module.ts | 4 +- .../routes/usercenter/usercenter.module.ts | 6 +- src/assets/mocks/menu-data.json | 13 +- 20 files changed, 3010 insertions(+), 9 deletions(-) create mode 100644 src/app/routes/usercenter/components/driver/detail/detail.component.html create mode 100644 src/app/routes/usercenter/components/driver/detail/detail.component.less create mode 100644 src/app/routes/usercenter/components/driver/detail/detail.component.spec.ts create mode 100644 src/app/routes/usercenter/components/driver/detail/detail.component.ts create mode 100644 src/app/routes/usercenter/components/driver/driver.component.html create mode 100644 src/app/routes/usercenter/components/driver/driver.component.spec.ts create mode 100644 src/app/routes/usercenter/components/driver/driver.component.ts create mode 100644 src/app/routes/usercenter/components/driver/new/new.component.html create mode 100644 src/app/routes/usercenter/components/driver/new/new.component.less create mode 100644 src/app/routes/usercenter/components/driver/new/new.component.ts create mode 100644 src/app/routes/usercenter/components/driver/view/view.component.html create mode 100644 src/app/routes/usercenter/components/driver/view/view.component.less create mode 100644 src/app/routes/usercenter/components/driver/view/view.component.spec.ts create mode 100644 src/app/routes/usercenter/components/driver/view/view.component.ts diff --git a/src/app/routes/usercenter/components/driver/detail/detail.component.html b/src/app/routes/usercenter/components/driver/detail/detail.component.html new file mode 100644 index 00000000..4aafe892 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/detail/detail.component.html @@ -0,0 +1,289 @@ + + + + + + + + + + + + +
+ + + +
确定冻结该企业吗?
+
+ 停用后,该企业将被限制使用,不限于访问受限、无法发布货源等,请谨慎操作 +
+
+
+ +
+ + + +
确定启用该企业吗?
+
+ 启用后,该企业将恢复正常使用功能,请再次确认 +
+
+
+ +
+ + + +
确定关闭该企业支付权限吗?
+
+ 停用后,该企业将被限制使用支付功能,请谨慎操作 +
+
+
+ +
+ + + +
确定开通该企业支付权限吗?
+
+ 启用后,该企业将恢复正常支付功能,请再次确认 +
+
+
+
+ + + 联系信息人 + + {{ detailData?.contactsName }} + + + {{ detailData?.contactsPhone }} + + + {{ detailData?.contactsPhone }} + + + + + + + + 公司基本信息 + + {{ detailData?.enterpriseName }} + + + {{ detailData?.unifiedSocialCreditCode }} + + + {{ detailData?.enterpriseType }} + + + {{ detailData?.registrationCapital }} + 万元 + + + {{ detailData?.enterpriseRegistrationTime }} + + +
+ {{ detailData?.operatingStartTime }} 至 {{ detailData?.operatingEndTime }} +
+
长期
+
{{ detailData?.operatingStartTime }} 至 长期
+
+
+ + + {{ detailData?.enterpriseAddressCodeStr }} + + + {{ detailData?.enterpriseAddress }} + + + + + {{ detailData?.enterpriseAddressCodeStr }} + + + {{ detailData?.enterpriseAddress }} + + + + + {{ detailData?.enterpriseAddressCodeStr }} + + + {{ detailData?.enterpriseAddress }} + + + + + {{ detailData?.businessScope }} + + + + + + + + 法人信息 + + {{ detailData?.name }} + + + {{ detailData?.certificateNumber }} + + + {{ detailData?.validStartTime }} - + {{ detailData?.validEndTime ? detailData?.validEndTime : '长期' }} + + + + + + + + 银行结算信息 + + {{ detailData?.name }} + + + {{ detailData?.certificateNumber }} + + + {{ detailData?.validStartTime }} + + +
+
+ + +
+ + +
+
diff --git a/src/app/routes/usercenter/components/driver/detail/detail.component.less b/src/app/routes/usercenter/components/driver/detail/detail.component.less new file mode 100644 index 00000000..48f605d9 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/detail/detail.component.less @@ -0,0 +1,46 @@ +@import '~@delon/theme/index'; +:host { + ::ng-deep { + .ant-steps-dot { + .ant-steps-item-content { + width: 200px; + } + .ant-steps-item-icon { + margin-left: 96px; + } + .ant-steps-item-tail::after { + margin-left: 40px; + } + } + .success { + color: @success-color; + } + + .warning { + color: @warning-color; + } + + .error { + color: @error-color; + } + } + .mt16 { + margin-top: 16px; + } + .user-info { + display: flex; + font-size: 16px; + .enterprise-name { + margin-right: 15px; + } + img { + width: 64px; + height: 64px; + margin-right: 15px; + border-radius: 50%; + } + .user-info-des { + margin-bottom: 5px; + } + } +} diff --git a/src/app/routes/usercenter/components/driver/detail/detail.component.spec.ts b/src/app/routes/usercenter/components/driver/detail/detail.component.spec.ts new file mode 100644 index 00000000..00666a0b --- /dev/null +++ b/src/app/routes/usercenter/components/driver/detail/detail.component.spec.ts @@ -0,0 +1,31 @@ +/* + * @Author: your name + * @Date: 2021-11-29 20:19:08 + * @LastEditTime: 2021-11-29 20:31:00 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\usercenter\components\freight\list\detail\detail.component.spec.ts + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { FreightComponentsListDetailComponent } from './detail.component'; + +describe('FreightComponentsListDetailComponent', () => { + let component: FreightComponentsListDetailComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FreightComponentsListDetailComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FreightComponentsListDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/usercenter/components/driver/detail/detail.component.ts b/src/app/routes/usercenter/components/driver/detail/detail.component.ts new file mode 100644 index 00000000..809f567f --- /dev/null +++ b/src/app/routes/usercenter/components/driver/detail/detail.component.ts @@ -0,0 +1,255 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { UsermanageService } from '../../../../services/usercenter.service'; + +@Component({ + selector: 'app-supplier-components-list-view', + templateUrl: './detail.component.html', + styleUrls: ['./detail.component.less'], +}) +export class FreightComponentsListDetailComponent implements OnInit { + i: any; + url = `/rule?_allow_anonymous=true`; + @ViewChild('st', { static: false }) st!: STComponent; + detailData: any; + isShow = false; + isVisible = false; + modalTitle = '有效期'; + modalName = ''; + ui!: SFUISchema; + schema!: SFSchema; + @ViewChild('sf', { static: false }) sf!: SFComponent; + schema1!: SFSchema; + @ViewChild('sf1', { static: false }) sf1!: SFComponent; + validData: any = ['suppliersType']; + suppliersData: any = {}; + + constructor( + private http: _HttpClient, + private modal: ModalHelper, + public service: UsermanageService, + private route: ActivatedRoute, + private modalHelper: ModalHelper, + private msgSrv: NzMessageService, + ) {} + + ngOnInit() { + console.log(this.route.snapshot); + // this.initData(); + this.initSF(); + this.initSF1(); + // this.launchSign(); + } + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + effectiveDate: { + title: '有效期', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd 00:00:00', + // hidden: this.modalName === 'effectiveDate' ? false : true, + } as SFDateWidgetSchema, + }, + }, + required: ['effectiveDate'], + }; + this.ui = { '*': { spanLabelFixed: 120, grid: { span: 24 } } }; + } + initSF1() { + this.schema1 = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + suppliersType: { + type: 'string', + title: '类型', + enum: [ + { label: '非外部供应商', value: 0 }, + { label: '外部供应商', value: 1 }, + ], + default: '', + ui: { + widget: 'select', + change: (args: any) => { + console.log(args, 'args'); + this.suppliersData.suppliersType = args; + if (args === 1) { + this.validData = ['suppliersType', 'externalSuppliersId']; + } else { + this.validData = ['suppliersType']; + this.suppliersData.externalSuppliersId = ''; + } + this.initSF1(); + }, + }, + }, + externalSuppliersId: { + title: '外部供应商id', + type: 'string', + default: '', + ui: { + visibleIf: { suppliersType: (value: any) => value === 1 }, + }, + }, + }, + required: this.validData, + }; + } + showModal(name: any) { + this.modalName = name; + if (name === 'effectiveDate') { + this.isShow = true; + } else { + this.isVisible = true; + } + } + async initData() { + console.log(this.route.snapshot, 'this.route.snapshot'); + + const params = { + tenantId: this.route.snapshot.params.id, + // tenantId: this.route.snapshot.queryParams.tenantId, + }; + const res = await this.service.asyncRequest(this.service.$api_get_supplier_info, params); + // // 商品资质 + // if (res.enterpriseBusinessJson) { + // res.enterpriseBusinessJson.aptitudes = res.enterpriseBusinessJson?.aptitudes ? res.enterpriseBusinessJson.aptitudes.split(',') : []; + // } + // // // 申请人身份证证件 + // // res.applyUserJson.imagelist = []; + // // res.applyUserJson.imagelist.push(res.applyUserJson.certificatePhotoFront); + // // res.applyUserJson.imagelist.push(res.applyUserJson.certificatePhotoBack); + // // res.applyUserJson.imagelist.push(res.applyUserJson.handCertificate); + + // 法人身份证证件 + const imagelist = []; + imagelist.push(res?.certificatePhotoFront); + imagelist.push(res?.certificatePhotoBack); + res.certificatePhoto = imagelist; + + // 营业执照 + res.enterpriseQualificationCertificate = res.enterpriseQualificationCertificate + ? res.enterpriseQualificationCertificate.split(',') + : []; + + // 返回所在地 + res.enterpriseAddressCodeStr = await this.getRegionFullName(res.enterpriseAddressCode); + + this.detailData = res; + this.suppliersData = { + suppliersType: res?.suppliersType, + externalSuppliersId: res?.externalSuppliersId, + }; + } + + /** + * 根据地区code查询地区详情 + * @param code 地区代码 + */ + async getRegionFullName(code: any) { + const params = { + regionCode: code, + }; + const res = await this.service.asyncRequest(this.service.$api_get_region_detailByCode, params, 'POST', true); + // if (res && res.regionFullName) { + // const arr = res.regionFullName.split(','); + // res.regionFullName = arr.reverse().join('-'); + // } + return res && res.regionFullName; + } + add() { + // this.modal + // .createStatic(FormEditComponent, { i: { id: 0 } }) + // .subscribe(() => this.st.reload()); + } + goBack() { + window.history.go(-1); + } + /** + * 冻结 + */ + freezeOrResume(type: number) { + console.log(type) + // this.service.http + // .post(this.service.$api_set_freezeOrResume, { + // tenantId: this.route.snapshot.params.id, + // // tenantId: this.route.snapshot.queryParams.tenantId, + // status: type, + // }) + // .subscribe((res) => { + // if (res.data === true) { + // if (type === 0) { + // this.service.msgSrv.success(`启用成功!`); + // } else if (type === 1) { + // this.service.msgSrv.success(`冻结成功!`); + // } + // this.ngOnInit(); + // } else { + // this.service.msgSrv.error(res.msg || '操作失败!'); + // } + // }); + } + PayOrResume(type: number) { + console.log(type) + // this.service.http + // .post(this.service.$api_set_freezeOrResume, { + // tenantId: this.route.snapshot.params.id, + // // tenantId: this.route.snapshot.queryParams.tenantId, + // status: type, + // }) + // .subscribe((res) => { + // if (res.data === true) { + // if (type === 0) { + // this.service.msgSrv.success(`启用成功!`); + // } else if (type === 1) { + // this.service.msgSrv.success(`冻结成功!`); + // } + // this.ngOnInit(); + // } else { + // this.service.msgSrv.error(res.msg || '操作失败!'); + // } + // }); + } + + handleCancel(name: any) { + if (name === 'effectiveDate') { + this.isShow = false; + } else { + this.isVisible = false; + } + } + handleOK(name: any) { + const params: any = { + tenantId: this.route.snapshot.params.id, + // tenantId: this.route.snapshot.queryParams.tenantId, + }; + + if (name === 'effectiveDate') { + params.effectiveDate = this.sf?.value?.effectiveDate; + } else { + Object.assign(params, this.sf1?.value); + } + this.service.http.post(this.service.$api_set_freezeOrResume, params).subscribe((res) => { + if (res.data === true) { + this.service.msgSrv.success(`编辑成功!`); + this.ngOnInit(); + } else { + this.service.msgSrv.error(res.msg || '编辑失败!'); + } + if (name === 'effectiveDate') { + this.isShow = false; + } else { + this.isVisible = false; + } + }); + } +} diff --git a/src/app/routes/usercenter/components/driver/driver.component.html b/src/app/routes/usercenter/components/driver/driver.component.html new file mode 100644 index 00000000..fcb84ee1 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/driver.component.html @@ -0,0 +1,84 @@ + + + + + + +
+ +
+ + +
+ + + + +
+ +
+
+ + + + + +
+
+
+
+ + + + + + +
+
+ {{ item.enterpriseName }} +
+
+
+ +
+ {{ item.contactsPhone }} +
+
+ + 冻结 + 正常 + +
+
diff --git a/src/app/routes/usercenter/components/driver/driver.component.spec.ts b/src/app/routes/usercenter/components/driver/driver.component.spec.ts new file mode 100644 index 00000000..f2b5ea4e --- /dev/null +++ b/src/app/routes/usercenter/components/driver/driver.component.spec.ts @@ -0,0 +1,31 @@ +/* + * @Author: your name + * @Date: 2021-11-30 16:56:15 + * @LastEditTime: 2021-11-30 17:00:07 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\usercenter\components\driver\driver.component.spec.ts + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { UserCenterComponentsDriverComponent } from './driver.component'; + +describe('UserCenterComponentsDriverComponent', () => { + let component: UserCenterComponentsDriverComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [UserCenterComponentsDriverComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UserCenterComponentsDriverComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/usercenter/components/driver/driver.component.ts b/src/app/routes/usercenter/components/driver/driver.component.ts new file mode 100644 index 00000000..5dc1c1af --- /dev/null +++ b/src/app/routes/usercenter/components/driver/driver.component.ts @@ -0,0 +1,228 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STColumnBadge, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { UsermanageService } from '../../services/usercenter.service'; +@Component({ + selector: 'app-usercenter-components-driver', + templateUrl: './driver.component.html', +}) +export class UserCenterComponentsDriverComponent implements OnInit { + _$expand = false; + url = `/rule?_allow_anonymous=true`; + + ui!: SFUISchema; + schema!: SFSchema; + columns!: STColumn[]; + datalist = [ + { + storeName: '企业名称', + contactsName: '152746565', + enterpriseName: '湖南', + unifiedSocialCreditCode: '45454', + contactsPhone: '*97889461561', + effectiveDateStr: '废弃eww', + enStatusStr2: '正常', + enStatusStr3: '正常', + unifiedSocialCreditCode3: '常用服务', + unifiedSocialCreditCode2: '正常', + tenantId: 1 + }, + { + storeName: '企业名称', + contactsName: '152746565', + enterpriseName: '湖南', + unifiedSocialCreditCode: '45454', + contactsPhone: '*97889461561', + effectiveDateStr: '废弃eww', + enStatusStr2: '正常', + enStatusStr3: '正常', + unifiedSocialCreditCode3: '常用服务', + unifiedSocialCreditCode2: '正常', + tenantId: 2 + }, + ] + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + + constructor(public service: UsermanageService, private modal: NzModalService, private router: Router, private ar: ActivatedRoute) {} + /** + * 查询字段个数navigate + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + + /** + * 查询参数 + */ + get reqParams() { + const params: any = { + ...(this.sf && this.sf.value), + }; + if (this.sf?.value.effectiveDate) { + params.effectiveDateStart = this.sf?.value.effectiveDate[0]; + params.effectiveDateEnd = this.sf?.value.effectiveDate[1]; + } + delete params.effectiveDate; + delete params.expand; + return params; + } + + get selectedRows() { + return this.st?.list.filter((item) => item.checked) || []; + } + + ngOnInit() { + this.initSF(); + this.initST(); + this.ar.url.subscribe((params) => { + this.st?.load(1); + }); + } + dataProcess(data: STData[]): STData[] { + return data.map((i, index) => { + i.showSortFlag = false; + return i; + }); + } + initSF() { + this.schema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true, + }, + }, + storeName: { title: '企业名称', type: 'string', ui: { showRequired: false } }, + contactsName: { + title: '联系人', + type: 'string', + ui: { + showRequired: false, + }, + }, + unifiedSocialCreditCode: { + title: '税源地', + type: 'string', + ui: { + showRequired: false, + }, + }, + enStatus: { + type: 'string', + title: '货主状态', + enum: [ + { label: '全部', value: '' }, + { label: '正常', value: 0 }, + { label: '冻结', value: 1 }, + { label: '废弃', value: 2 }, + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value, + }, + }, + }, + enStatus2: { + type: 'string', + title: 'CRM审核状态', + enum: [ + { label: '全部', value: '' }, + { label: '正常', value: 0 }, + { label: '冻结', value: 1 }, + { label: '废弃', value: 2 }, + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value, + }, + }, + }, + }, + }; + this.ui = { '*': { spanLabelFixed: 90, grid: { span: 8, gutter: 4 }, enter: () => this.st.load() } }; + } + + initST() { + this.columns = [ + // { title: '', type: 'checkbox', className: 'text-center' }, + { title: '企业名称', className: 'text-center', index: 'storeName' }, + { title: '联系人', className: 'text-center', index: 'contactsName' }, + { title: '税源地', className: 'text-center', render: 'enterpriseName' }, + { title: '累计运单金额', className: 'text-center', index: 'unifiedSocialCreditCode' }, + { title: '道运证', className: 'text-center', index: 'contactsPhone', + render: 'contactsPhone' + }, + { title: '企业状态', className: 'text-center', index: 'effectiveDateStr', + type: 'badge', + badge: { + 正常: { text: '正常', color: 'success' }, + 冻结: { text: '冻结', color: 'warning' }, + 废弃: { text: '废弃', color: 'default' }, + }, + }, + { + title: 'CRM审核状态', + className: 'text-center', + index: 'enStatusStr2', + type: 'badge', + badge: { + 正常: { text: '正常', color: 'success' }, + 冻结: { text: '冻结', color: 'warning' }, + 废弃: { text: '废弃', color: 'default' }, + }, + }, + { + title: '代收权限', + className: 'text-center', + index: 'enStatusStr3', + type: 'badge', + badge: { + 正常: { text: '正常', color: 'success' }, + 冻结: { text: '冻结', color: 'warning' }, + 废弃: { text: '废弃', color: 'default' }, + }, + }, + { title: '常用服务', className: 'text-center', index: 'unifiedSocialCreditCode3' }, + { title: '推广业务员', className: 'text-center', index: 'unifiedSocialCreditCode2' }, + { + title: '操作', + width: '170px', + className: 'text-center', + buttons: [ + { + text: '查看', + click: (item) => { + this.router.navigate(['./detail', item.tenantId], { relativeTo: this.ar }); + // this.router.navigate(['./view', item.id], { relativeTo: this.ar, queryParams: { tenantId: item.tenantId } }); + }, + }, + ], + }, + ]; + } + daoyun(item: any) { + this.router.navigate(['./view', item.tenantId], { relativeTo: this.ar }); + } + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + creat() { + this.router.navigate(['./new',], { relativeTo: this.ar }); + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } +} diff --git a/src/app/routes/usercenter/components/driver/new/new.component.html b/src/app/routes/usercenter/components/driver/new/new.component.html new file mode 100644 index 00000000..fe0400fa --- /dev/null +++ b/src/app/routes/usercenter/components/driver/new/new.component.html @@ -0,0 +1,109 @@ + + + + + +
营业执照基本信息
+
+ +
营业执照法人信息
+
+ +
+ 请上传营业执照原件的高清照片,若上传复印件,则需加盖公司印章; +
上传后系统会自动识别并填写
+
+
+ +
万元
+
+ + +
+
请上传身份证原件的高清照片,若上传复印件,则需申请人签字;
+
上传后系统会自动识别并填写
+
+
+ +
+
+
正面照(人像面)
+
示例
+
+
+
+
+ +
+
+
背面照(国徽面)
+
示例
+
+
+
+
+ +
+ + +
公司其他补充信息
+
+ +
企业管理员信息
+
+ + +
+
请上传该企业授权您成为本系统企业管理员的文件的高清照片,需加盖公司印章
+
上传后系统会自动识别并填写
+
+
+
+ +
+
+
+
示例
+
+
+
+
+ +
+
{{ telephone }} 默认当前登录账号绑定的手机号
+
+
+ +
+
请上传身份证原件的高清照片,若上传复印件,则需申请人签字;
+
上传后系统会自动识别并填写
+
+
+ +
+
+
正面照(人像面)
+
示例
+
+
+
+
+ +
+
+
背面照(国徽面)
+
示例
+
+
+
+
+ +
+ + +
+ + +
+
+
diff --git a/src/app/routes/usercenter/components/driver/new/new.component.less b/src/app/routes/usercenter/components/driver/new/new.component.less new file mode 100644 index 00000000..55bf514e --- /dev/null +++ b/src/app/routes/usercenter/components/driver/new/new.component.less @@ -0,0 +1,109 @@ +:host { + ::ng-deep { + nz-card { + .page-title { + margin-bottom: 39px; + color : #333; + font-weight : 500; + font-size : 20px; + line-height : 28px; + text-align : center; + } + + .step-title { + display: block; + width : 800px !important; + margin : 0 auto; + } + + .myForm { + width : 680px; + margin: 5rem auto; + } + + .steps-content { + min-height: 250px; + } + + .btn-submit { + margin-top: 16px; + } + + .pr { + position: relative; + } + + .pa { + position: absolute; + top : 35px; + left : 150px; + } + + .tips { + display : flex; + margin-bottom: 0; + color : #333; + + dt { + width: 150px; + } + + dd { + width : 190px; + margin-bottom: 0; + text-align : center; + } + } + + .form-title { + margin-bottom: 10px; + padding-left : 8px; + color : #333; + font-weight : 700; + font-size : 18px; + line-height : 20px; + border-left : solid 3px #1890ff; + } + + .form-content { + padding: 48px 32px; + } + + .apply-sv { + margin : 16px 0; + padding : 20px; + background : #f8f8f8; + border-radius: 2px; + } + + .result-date { + font-size: 12px; + } + + .result-tips { + color : #ff4d4f; + font-size: 14px; + } + + .sv-img { + display : inline-block; + width : 104px; + height : 104px; + margin-right : 20px; + padding : 8px; + background : #fff; + border : 1px solid rgba(0, 0, 0, 0.15); + border-radius: 2px; + + img { + width : 100%; + height: 100%; + } + } + } + + .ant-row { + margin-left: 100px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/usercenter/components/driver/new/new.component.ts b/src/app/routes/usercenter/components/driver/new/new.component.ts new file mode 100644 index 00000000..df20847f --- /dev/null +++ b/src/app/routes/usercenter/components/driver/new/new.component.ts @@ -0,0 +1,1400 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { apiConf } from '@conf/api.conf'; +import { + SFCascaderWidgetSchema, + SFCheckboxWidgetSchema, + SFComponent, + SFDateWidgetSchema, + SFSchema, + SFSchemaEnum, + SFSelectWidgetSchema, + SFTextareaWidgetSchema, + SFUISchema, + SFUploadWidgetSchema, +} from '@delon/form'; +import { ModalHelper } from '@delon/theme'; +import { EnvironmentService } from '@env/environment.service'; +import { NzCascaderOption } from 'ng-zorro-antd/cascader'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +// import { AccountService } from '../../services/account.service'; +// import { AccountComponentsImgViewComponent } from '../img-view/img-view.component'; + +@Component({ + selector: 'app-account-components-freight-new', + templateUrl: './new.component.html', + styleUrls: ['./new.component.less'], +}) +export class FreightComponentsListNewComponent implements OnInit { + url = `/rule?_allow_anonymous=true`; + + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('sf1', { static: false }) + sf1!: SFComponent; + // @ViewChild('sf2', { static: false }) + // sf2!: SFComponent; + // @ViewChild('sf3', { static: false }) + // sf3!: SFComponent; + telephone = ''; + record: any = {}; + i: any; + schema!: SFSchema; + schema1!: SFSchema; + // schema2!: SFSchema; + // schema3!: SFSchema; + ui!: SFUISchema; + + id!: string; + isEdit!: boolean; + subStep = 0; + infoData: any = {}; + infoData1: any = {}; + infoData2: any = { + accountName: '', + }; + infoData3: any = {}; + branchBankName = ''; + bankArea = ''; + bankName = ''; + bankLogoUrl = ''; + bankRegion: any[] = []; + branchBanks: any[] = []; + signingPeriod = 2; + pdfSrc: any; + result = true; + enterpriseAddressCodeStr = ''; + enterpriseAddressCode: any; + enterpriseBusinessAddressCodeStr = ''; + enterpriseBusinessAddressCode = ''; + taxpayerTypeStr = ''; + regionData: any = []; + aptitudes: any = []; + constructor( + private routerinfo: ActivatedRoute, + public msg: NzMessageService, + private router: Router, + private modalService: NzModalService, + private modal: ModalHelper, + ) {} + ngOnInit() { + this.id = this.routerinfo.snapshot.queryParams.id; + + if (this.routerinfo.snapshot.queryParams.id) { + this.isEdit = true; + this.getApplicationInfo(this.routerinfo.snapshot.queryParams.id); + } else { + this.getUserDetail(); + } + this.initSF(); + } + initSF() { + this.schema = { + properties: { + title1: { + title: '', + type: 'string', + ui: { + widget: 'custom', + }, + }, + + // tipsE: { + // title: '', + // type: 'string', + // ui: { + // widget: 'custom', + // offsetControl: 6, + // }, + // }, + tipsD: { + title: '企业授权函', + type: 'string', + ui: { + widget: 'custom', + }, + }, + tipsE: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + certificatePhotoFront2: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.fileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: this.envSrv.getEnvironment().appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + this.checkIdCard(args.fileList[0].response.url, 0, 1); + } + }, + } as SFUploadWidgetSchema, + }, + region2: { + type: 'number', + title: '常用服务', + enum: this.regionData, + // default: [110000, 110100, 110105], + ui: { + width: 700, + widget: 'cascader', + valueProperty: 'regionCode', + labelProperty: 'name', + change: (ngModel: string | any[]) => { + const len = ngModel.length - 1; + this.enterpriseAddressCode = ngModel[len]; + // this.getRegionDetailByCode(ngModel[len],'name', 1); // 获取省市区名称 + }, + selectionChange: (values: NzCascaderOption[]) => { + // 获取省市区名称 + const len = values.length - 1; + this.enterpriseAddressCodeStr = values[len].regionFullName.split(',').reverse().join(''); + }, + }, + }, + contactsName: { + title: '推广业务员手机号', + type: 'string', + minLength: 1, + maxLength: 32, + ui: { + width: 700, + placeholder: '请输入您的真实姓名', + errors: { + required: '请输入您的真实姓名', + }, + }, + }, + title99: { + title: '', + type: 'string', + ui: { + widget: 'custom', + }, + }, + tipsA: { + title: '企业管理员证件照', + type: 'string', + ui: { + widget: 'custom', + }, + }, + certificatePhotoFront: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.fileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: this.envSrv.getEnvironment().appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + this.checkIdCard(args.fileList[0].response.url, 0, 1); + } + }, + } as SFUploadWidgetSchema, + }, + tipsB: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + certificatePhotoBack: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.fileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: this.envSrv.getEnvironment().appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + this.checkIdCard(args.fileList[0].response.url, 1, 1); + } + }, + } as SFUploadWidgetSchema, + }, + name: { + title: '企业管理员姓名', + type: 'string', + maxLength: 8, + ui: { + width: 700, + placeholder: '请输入营业执照上的企业管理员姓名', + }, + }, + certificateNumber: { + title: '企业管理员身份证号', + type: 'string', + format: 'id-card', + minLength: 1, + maxLength: 18, + ui: { + width: 700, + placeholder: '请输入法定代表人身份证号码', + }, + }, + telephone: { + title: '企业管理员手机号', + type: 'string', + maxLength: 11, + format: 'mobile', + ui: { + placeholder: '请输入企业管理员手机号', + }, + }, + }, + required: ['contactsName'], + }; + this.schema1 = { + properties: { + title1: { + title: '', + type: 'string', + ui: { + widget: 'custom', + }, + }, + tips: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + enterpriseQualificationCertificate: { + type: 'string', + title: '营业执照', + ui: { + action: apiConf.fileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: this.envSrv.getEnvironment().appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + this.checkBusinessLicense(args.fileList[0].response.url); + } + }, + } as SFUploadWidgetSchema, + }, + unifiedSocialCreditCode: { + title: '统一社会信用代码', + type: 'string', + minLength: 1, + maxLength: 18, + ui: { + width: 700, + optionalHelp: + '为了企业用户的使用体验,若公司代码即统一社会信用代码已在本应用其他关联平台注册,则此处填写的公司资料将同步更新至对应已注册的平台', + placeholder: '请输入营业执照上的统一社会信用代码', + errors: { + required: '请输入18位公司代码', + }, + }, + }, + enterpriseName: { + title: '公司名称', + type: 'string', + minLength: 2, + maxLength: 100, + ui: { + width: 700, + placeholder: '请输入公司名称', + errors: { + required: '请输入公司名称', + }, + }, + }, + enterpriseType: { + title: '公司类型', + type: 'string', + minLength: 1, + maxLength: 30, + ui: { + width: 700, + placeholder: '请输入公司类型', + errors: { + required: '请输入公司类型', + }, + }, + }, + region: { + type: 'number', + title: '营业执照所在地', + enum: this.regionData, + // default: [110000, 110100, 110105], + ui: { + width: 700, + widget: 'cascader', + valueProperty: 'regionCode', + labelProperty: 'name', + change: (ngModel: string | any[]) => { + const len = ngModel.length - 1; + this.enterpriseAddressCode = ngModel[len]; + // this.getRegionDetailByCode(ngModel[len],'name', 1); // 获取省市区名称 + }, + selectionChange: (values: NzCascaderOption[]) => { + // 获取省市区名称 + const len = values.length - 1; + this.enterpriseAddressCodeStr = values[len].regionFullName.split(',').reverse().join(''); + }, + }, + }, + enterpriseAddress: { + title: '营业执照详细地址', + type: 'string', + minLength: 1, + maxLength: 240, + ui: { + width: 700, + widget: 'textarea', + autosize: { minRows: 2, maxRows: 5 }, + placeholder: '请输入营业执照上的完整详细地址', + errors: { + required: '请输入营业执照上的完整详细地址', + }, + } as SFTextareaWidgetSchema, + }, + + title2: { + title: '', + type: 'string', + ui: { + widget: 'custom', + }, + }, + tipsC: { + title: '法定代表人证件照', + type: 'string', + ui: { + widget: 'custom', + // offsetControl: 6, + }, + }, + tipsA: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + certificatePhotoFront: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.fileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: this.envSrv.getEnvironment().appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + this.checkIdCard(args.fileList[0].response.url, 0, 1); + } + }, + } as SFUploadWidgetSchema, + }, + tipsB: { + title: '', + type: 'string', + ui: { + widget: 'custom', + offsetControl: 6, + }, + }, + certificatePhotoBack: { + type: 'string', + title: '', + ui: { + offsetControl: 6, + action: apiConf.fileUpload, + fileType: 'image/png,image/jpeg,image/jpg,image/gif', + fileSize: 5120, + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: this.envSrv.getEnvironment().appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + this.checkIdCard(args.fileList[0].response.url, 1, 1); + } + }, + } as SFUploadWidgetSchema, + }, + name: { + title: '法人姓名', + type: 'string', + maxLength: 8, + ui: { + width: 700, + placeholder: '请输入营业执照上的法人姓名', + }, + }, + region2: { + type: 'number', + title: '法人证件类型', + enum: this.regionData, + // default: [110000, 110100, 110105], + ui: { + width: 700, + widget: 'cascader', + valueProperty: 'regionCode', + labelProperty: 'name', + change: (ngModel: string | any[]) => { + const len = ngModel.length - 1; + this.enterpriseAddressCode = ngModel[len]; + // this.getRegionDetailByCode(ngModel[len],'name', 1); // 获取省市区名称 + }, + selectionChange: (values: NzCascaderOption[]) => { + // 获取省市区名称 + const len = values.length - 1; + this.enterpriseAddressCodeStr = values[len].regionFullName.split(',').reverse().join(''); + }, + }, + }, + certificateNumber: { + title: '法定代表人身份证号码', + type: 'string', + format: 'id-card', + minLength: 1, + maxLength: 18, + ui: { + width: 700, + placeholder: '请输入法定代表人身份证号码', + }, + }, + validStartTime: { + title: '身份证有效开始日期', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择', + errors: { + required: '请选择开始日期', + }, + change: (i) => { + // this.sf1?.setValue('/dateType1', false); + }, + } as SFDateWidgetSchema, + }, + validEndTime: { + title: '身份证有效截止日期', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd', + placeholder: '请选择', + errors: { + required: '请选择截止日期', + }, + change: (i) => { + this.sf1?.setValue('/dateType1', false); + }, + } as SFDateWidgetSchema, + }, + dateType1: { + title: '长期', + type: 'boolean', + // enum: [{ label: '长期', value: true }], + ui: { + widget: 'checkbox', + change: (i) => this.longTime(i, 'schema11'), + } as SFCheckboxWidgetSchema, + }, + }, + required: [ + 'enterpriseQualificationCertificate', + 'unifiedSocialCreditCode', + 'enterpriseName', + 'enterpriseType', + 'region', + 'enterpriseAddress', + 'registrationCapital', + 'enterpriseRegistrationTime', + 'operatingEndTime', + 'operatingStartTime', + 'dateType', + 'businessScope', + 'certificatePhotoFront', + 'certificatePhotoBack', + 'name', + 'certificateNumber', + 'validStartTime', + 'validEndTime', + 'dateType1', + ], + }; + + this.ui = { + '*': { + spanLabelFixed: 180, + grid: { span: 24 }, + }, + $title1: { + spanLabelFixed: 0, + }, + $title99: { + spanLabelFixed: 0, + }, + $title2: { + spanLabelFixed: 0, + }, + $title3: { + spanLabelFixed: 0, + }, + $registrationCapital: { + spanLabelFixed: 180, + grid: { span: 11 }, + }, + $unit: { + spanLabelFixed: 100, + grid: { span: 6 }, + }, + }; + } + submitForm() { + + } + // submitForm() { + // // 营业执照基本信息 + // if (!this.sf.value.contactsName) { + // // this.service.msgSrv.warning('请填写申请人姓名'); + // return; + // } + // if (!this.sf1.value.enterpriseQualificationCertificate) { + // // this.service.msgSrv.warning('请上传营业执照'); + // return; + // } + // if (!this.sf1.value.unifiedSocialCreditCode) { + // // this.service.msgSrv.warning('请填写统一社会信用代码'); + // return; + // } + // if (!this.sf1.value.enterpriseName) { + // // this.service.msgSrv.warning('请填写公司名称'); + // return; + // } + // if (!this.sf1.value.enterpriseType) { + // // this.service.msgSrv.warning('请填写公司类型'); + // return; + // } + // if (!this.sf1.value.region) { + // // this.service.msgSrv.warning('请选择所在地区'); + // return; + // } + // if (!this.sf1.value.enterpriseAddress) { + // // this.service.msgSrv.warning('请填写营业执照详细地址'); + // return; + // } + // if (!this.sf1.value.registrationCapital) { + // // this.service.msgSrv.warning('请填写注册资本'); + // return; + // } + // if (!this.sf1.value.enterpriseRegistrationTime) { + // // this.service.msgSrv.warning('请选择成立日期'); + // return; + // } + // if (!this.sf1.value.operatingStartTime) { + // // this.service.msgSrv.warning('请选择营业期限开始日期'); + // return; + // } + // if (this.sf1.value.dateType !== true) { + // if (!this.sf1.value.operatingEndTime) { + // this.service.msgSrv.warning('请选择营业期限结束日期'); + // return; + // } + // if (this.sf1.value.operatingEndTime <= this.sf1.value.operatingStartTime) { + // this.service.msgSrv.warning('营业期限结束日期不能小于或等于开始日期'); + // return; + // } + // } + // if (!this.sf1.value.businessScope) { + // this.service.msgSrv.warning('请填写经营范围'); + // return; + // } + // if (!this.sf1.value.certificatePhotoFront) { + // this.service.msgSrv.warning('请上传身份证正面照'); + // return; + // } + // if (!this.sf1.value.certificatePhotoBack) { + // this.service.msgSrv.warning('请上传身份证反面照'); + // return; + // } + // if (!this.sf1.value.name) { + // this.service.msgSrv.warning('请填写法定代表人'); + // return; + // } + // if (!this.sf1.value.certificateNumber) { + // this.service.msgSrv.warning('请填写法定代表人身份证号'); + // return; + // } + // if (!this.sf1.value.validStartTime) { + // this.service.msgSrv.warning('请选择身份证有效开始日期'); + // return; + // } + // if (this.sf1.value.dateType1 !== true) { + // if (!this.sf1.value.validEndTime) { + // this.service.msgSrv.warning('请选择身份证有效截止日期'); + // return; + // } + // if (this.sf1.value.validEndTime <= this.sf1.value.validStartTime) { + // this.service.msgSrv.warning('身份证有效截止日期不能小于或等于开始日期'); + // return; + // } + // } + // const params: any = { + // contactsName: this.sf.value.contactsName, + // contactsPhone: this.sf.value.telephone, + // certificateNumber: this.sf1.value.certificateNumber, + // unifiedSocialCreditCode: this.sf1.value.unifiedSocialCreditCode, + // enterpriseAddressCodeStr: this.sf1.value.enterpriseAddressCodeStr, + // enterpriseAddressCode: this.sf1.value.region[2], + // enterpriseAddress: this.sf1.value.enterpriseAddress, + // enterpriseName: this.sf1.value.enterpriseName, + // enterpriseNameAbbreviation: this.sf1.value.enterpriseNameAbbreviation, + // enterpriseQualificationCertificate: this.sf1.value.enterpriseQualificationCertificate, + // enterpriseType: this.sf1.value.enterpriseType, + // enterpriseTelephone: this.sf1.value.enterpriseTelephone, + // enterpriseRegistrationTime: this.sf1.value.enterpriseRegistrationTime, + // businessScope: this.sf1.value.businessScope, + // operatingEndTime: this.sf1.value.operatingEndTime, + // operatingStartTime: this.sf1.value.operatingStartTime, + // organizationCode: this.sf1.value.organizationCode, + // registrationCapital: this.sf1.value.registrationCapital, + + // legalPersonIdentity: { + // // ...this.sf1.value, + // validStartTime: this.sf1.value.validStartTime, + // validEndTime: this.sf1.value.validEndTime, + // certificatePhotoBack: this.sf1.value.certificatePhotoBack, + // certificateNumber: this.sf1.value.certificateNumber, + // certificatePhotoFront: this.sf1.value.certificatePhotoFront, + // certificateType: this.sf1.value.certificateType, + // handCertificate: this.sf1.value.handCertificate, + // name: this.sf1.value.name, + // }, + // }; + // if (this.routerinfo.snapshot.queryParams.id) { + // params.id = this.routerinfo.snapshot.queryParams.id; + // } + // delete params?.tips; + // this.service.http.post(this.service.$api_supplierSubmitInfo, params).subscribe((res) => { + // if (res) { + // this.getApplicationInfo(res.data?.id); + // } + // }); + // } + getUserDetail() { + // this.service.http.post(this.service.$api_get_current_user_detail).subscribe((res) => { + // if (res) { + // this.infoData.telephone = res.data.phone; + // this.initSF(); + // } + // }); + } + + viewImg(image: any) { + // this.modal.createStatic(AccountComponentsImgViewComponent, { i: { imgUrl: image } }).subscribe(() => { + // // this.st.reload(); + // }); + } + getRegionToThree() { + // 获取一、二、三级地区详情 + // this.service.http.post(this.service.$api_getRegionToThree).subscribe((res) => { + // this.regionData = res.data; + // this.initSF(); + // }); + } + getApplicationInfo(id: string) { + // 查询申请信息详情 + const params: any = { + id, + }; + // this.service.http.post(this.service.$api_getSupplierEntryDetailInfo, params).subscribe((res) => { + // this.infoData.updateTime = res.data.updateTime; + // this.infoData.auditStatus = res.data.auditStatus; + // this.infoData.auditOpinion = res.data.auditOpinion; + // this.infoData1.contactsName = res.data.contactsName; + // this.infoData1.operationUserPhone = res.data.contactsPhone; + // this.infoData1.enterpriseName = res.data.enterpriseName; + // this.infoData1.unifiedSocialCreditCode = res.data.unifiedSocialCreditCode; + // this.infoData1.enterpriseType = res.data.enterpriseType; + // this.infoData1.registrationCapital = res.data.registrationCapital; + // this.infoData1.enterpriseRegistrationTime = res.data.operatingStartTime; + // this.infoData1.enterpriseRegistrationTime = res.data.operatingStartTime; + // this.infoData1.operatingStartTime = res.data.operatingStartTime; + // this.infoData1.operatingEndTime = res.data.operatingEndTime; + // this.infoData1.operatingEndTime = res.data.operatingEndTime; + // this.enterpriseAddressCodeStr = res.data.enterpriseAddressCodeStr; + // this.infoData1.enterpriseAddress = res.data.enterpriseAddress; + // this.infoData1.enterpriseBusinessAddress = res.data.enterpriseAddress; + // this.infoData1.businessScope = res.data.businessScope; + // this.infoData1.name = res.data.name; + // this.infoData1.certificateNumber = res.data.certificateNumber; + // this.infoData1.validStartTime = res.data.validStartTime; + // this.infoData1.validEndTime = res.data.validEndTime; + // this.infoData1.certificatePhotoFront = res.data.certificatePhotoFront; + // this.infoData1.enterpriseQualificationCertificate = res.data.enterpriseQualificationCertificate; + // this.infoData1.certificatePhotoBackurl = res.data.certificatePhotoBack; + // this.infoData1.certificatePhotoFronturl = res.data.certificatePhotoFront; + // this.infoData1.enterpriseQualificationCertificateurl = res.data.enterpriseQualificationCertificate; + + // this.infoData1.certificatePhotoBack = res.data.certificatePhotoBack; + // this.signingPeriod = res.data.signingPeriod; + // if (res.data) { + // // 申请人信息 + // this.infoData.certificatePhotoBack = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoBack, + // response: { + // url: res.data.certificatePhotoBack, + // }, + // }, + // ]; + // this.infoData.certificatePhotoFront = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoFront, + // response: { + // url: res.data.certificatePhotoFront, + // }, + // }, + // ]; + // if (!res.data.validEndTime) { + // this.infoData1.dateType1 = true; + // // this.sf.getProperty('/validStartTime').schema.readOnly = true; + // // this.sf.getProperty('/validEndTime').schema.readOnly = true; + // } + // } + // if (res.data) { + // // 营业执照基本信息 + // this.infoData1.enterpriseQualificationCertificate = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.enterpriseQualificationCertificate, + // response: { + // url: res.data.enterpriseQualificationCertificate, + // }, + // }, + // ]; + // this.infoData1.certificatePhotoFront = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoFront, + // response: { + // url: res.data.certificatePhotoFront, + // }, + // }, + // ]; + // this.infoData1.certificatePhotoBack = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoBack, + // response: { + // url: res.data.certificatePhotoBack, + // }, + // }, + // ]; + // this.infoData1.unifiedSocialCreditCode = res.data.unifiedSocialCreditCode; + // this.infoData1.enterpriseName = res.data.enterpriseName; + // this.infoData1.enterpriseType = res.data.enterpriseType; + // this.infoData1.enterpriseAddress = res.data.enterpriseAddress; + // // this.infoData1.enterpriseAddressCodeStr = res.data.businessLicenseJson.enterpriseAddressCodeStr; + // // this.infoData1.enterpriseBusinessAddressCodeStr = res.data.businessLicenseJson.enterpriseBusinessAddressCodeStr; + // this.infoData1.registrationCapital = res.data.registrationCapital; + // this.infoData1.enterpriseRegistrationTime = res.data.enterpriseRegistrationTime; + // this.infoData1.operatingStartTime = res.data.operatingStartTime; + // this.infoData1.operatingEndTime = res.data.operatingEndTime; + // this.infoData1.businessScope = res.data.businessScope; + // this.enterpriseAddressCodeStr = res.data.enterpriseAddressCodeStr; + // this.enterpriseAddressCode = +res.data.enterpriseAddressCode; + // this.getRegionDetailByCode(res.data.enterpriseAddressCode); + + // this.enterpriseBusinessAddressCodeStr = res.data.enterpriseBusinessAddressCodeStr; + // this.enterpriseBusinessAddressCode = res.data.enterpriseBusinessAddressCode; + // if (!res.data.operatingEndTime) { + // this.infoData1.dateType = true; + // } + // this.infoData.contactsName = res.data.contactsName; + // this.infoData.telephone = res.data.contactsPhone; + // } + + // if (res.data.auditStatus === 0 || res.data.auditStatus === 2 || res.data.auditStatus === 3) { + // // 1:待审核,2:复审,3:终审,5:已驳回 + // } else if (res.data.auditStatus === 1) { + // // 4:待签约 + // // this.getPdf(); + // // this.getEnterpriseInfo(this.id); + // } else if (res.data.auditStatus === 4) { + // // 6:已终止,7:已成功 + // this.step = 3; + // } + // this.initSF(); + // }); + } + getApplicationInfo2(id: string) { + // 查询申请信息详情 + const params: any = { + id, + }; + // this.service.http.post(this.service.$api_getSupplierEntryDetailInfo, params).subscribe((res) => { + // this.infoData.updateTime = res.data.updateTime; + // this.infoData.auditStatus = res.data.auditStatus; + // this.infoData.auditOpinion = res.data.auditOpinion; + // this.infoData1.contactsName = res.data.contactsName; + // this.infoData1.enterpriseName = res.data.enterpriseName; + // this.infoData1.unifiedSocialCreditCode = res.data.unifiedSocialCreditCode; + // this.infoData1.enterpriseType = res.data.enterpriseType; + // this.infoData1.registrationCapital = res.data.registrationCapital; + // this.infoData1.enterpriseRegistrationTime = res.data.operatingStartTime; + // this.infoData1.enterpriseRegistrationTime = res.data.operatingStartTime; + // this.infoData1.operatingStartTime = res.data.operatingStartTime; + // this.infoData1.operatingEndTime = res.data.operatingEndTime; + // this.infoData1.operatingEndTime = res.data.operatingEndTime; + // this.enterpriseAddressCodeStr = res.data.enterpriseAddressCodeStr; + // this.infoData1.enterpriseAddress = res.data.enterpriseAddress; + // this.infoData1.enterpriseBusinessAddress = res.data.enterpriseAddress; + // this.infoData1.businessScope = res.data.businessScope; + // this.infoData1.name = res.data.name; + // this.infoData1.certificateNumber = res.data.certificateNumber; + // this.infoData1.validStartTime = res.data.validStartTime; + // this.infoData1.validEndTime = res.data.validEndTime; + // this.infoData1.certificatePhotoFront = res.data.certificatePhotoFront; + // this.infoData1.enterpriseQualificationCertificate = res.data.enterpriseQualificationCertificate; + // this.infoData1.certificatePhotoBackurl = res.data.certificatePhotoBack; + // this.infoData1.certificatePhotoFronturl = res.data.certificatePhotoFront; + // this.infoData1.enterpriseQualificationCertificateurl = res.data.enterpriseQualificationCertificate; + + // this.infoData1.certificatePhotoBack = res.data.certificatePhotoBack; + // this.signingPeriod = res.data.signingPeriod; + // if (res.data) { + // // 申请人信息 + // this.infoData.certificatePhotoBack = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoBack, + // response: { + // url: res.data.certificatePhotoBack, + // }, + // }, + // ]; + // this.infoData.certificatePhotoFront = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoFront, + // response: { + // url: res.data.certificatePhotoFront, + // }, + // }, + // ]; + // if (!res.data.validEndTime) { + // this.infoData1.dateType = true; + // // this.sf.getProperty('/validStartTime').schema.readOnly = true; + // // this.sf.getProperty('/validEndTime').schema.readOnly = true; + // } + // } + // if (res.data) { + // // 营业执照基本信息 + // this.infoData1.enterpriseQualificationCertificate = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.enterpriseQualificationCertificate, + // response: { + // url: res.data.enterpriseQualificationCertificate, + // }, + // }, + // ]; + // this.infoData1.certificatePhotoFront = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoFront, + // response: { + // url: res.data.certificatePhotoFront, + // }, + // }, + // ]; + // this.infoData1.certificatePhotoBack = [ + // { + // uid: -1, + // name: 'LOGO', + // status: 'done', + // url: res.data.certificatePhotoBack, + // response: { + // url: res.data.certificatePhotoBack, + // }, + // }, + // ]; + // this.infoData1.unifiedSocialCreditCode = res.data.unifiedSocialCreditCode; + // this.infoData1.enterpriseName = res.data.enterpriseName; + // this.infoData1.enterpriseType = res.data.enterpriseType; + // this.infoData1.enterpriseAddress = res.data.enterpriseAddress; + // // this.infoData1.enterpriseAddressCodeStr = res.data.businessLicenseJson.enterpriseAddressCodeStr; + // // this.infoData1.enterpriseBusinessAddressCodeStr = res.data.businessLicenseJson.enterpriseBusinessAddressCodeStr; + // this.infoData1.registrationCapital = res.data.registrationCapital; + // this.infoData1.enterpriseRegistrationTime = res.data.enterpriseRegistrationTime; + // this.infoData1.operatingStartTime = res.data.operatingStartTime; + // this.infoData1.operatingEndTime = res.data.operatingEndTime; + // this.infoData1.businessScope = res.data.businessScope; + // this.enterpriseAddressCodeStr = res.data.enterpriseAddressCodeStr; + // this.enterpriseAddressCode = +res.data.enterpriseAddressCode; + // this.getRegionDetailByCode(res.data.enterpriseAddressCode); + + // this.enterpriseBusinessAddressCodeStr = res.data.enterpriseBusinessAddressCodeStr; + // this.enterpriseBusinessAddressCode = res.data.enterpriseBusinessAddressCode; + // if (!res.data.operatingEndTime) { + // this.infoData1.dateType1 = true; + // } + // this.infoData.contactsName = res.data.contactsName; + // this.infoData.telephone = res.data.contactsPhone; + // this.infoData1.operationUserPhone = res.data.contactsPhone; + // } + // this.initSF(); + // }); + } + reloadApply() { + // 重新申请入驻 + this.modalService.confirm({ + nzTitle: '确定要重新申请入驻吗?', + nzContent: '当前申请已填写的资料将清空,重新申请需要重新填写资料', + nzOnOk: () => + new Promise((resolve, reject) => { + this.sf.reset(); + resolve(1); + }).catch(() => console.log('Oops errors!')), + }); + } + + updateBranchList(bankId: any, regionCode: any) { + // return this.service + // .loadBranchBankList(bankId, regionCode) + // .pipe( + // map((data) => { + // return data.map((m) => { + // return { label: m.branchName, value: m.branchCode }; + // }); + // }), + // ) + // .subscribe((res) => { + // // this.sf2.getProperty('/bankBranchName')!.schema.enum = res; + // // this.sf2.getProperty('/bankBranchName')!.widget.reset(res || res[0]); + // this.branchBanks = res || []; + // // this.initSF(); + // }); + } + loadBranchBanks(bankId: any, regionCode: any) { + // this.service + // .loadBranchBankList(bankId, regionCode) + // .pipe( + // map((data) => { + // return data.map((m) => { + // return { label: m.branchName, value: m.branchCode }; + // }); + // }), + // ) + // .subscribe((res: any[]) => { + // this.branchBanks = res || []; + // this.getUserDetail(); + this.loadBrandDist(); + this.updateBranchList(bankId, regionCode); + // }); + } + loadBrandDist() { + // this.service.http.post(this.service.$api_get_all_region).subscribe((res) => { + // const data = res.data; + // data.forEach((item: { children: any[] }) => { + // item.children.forEach((element: { isLeaf: boolean }) => { + // element.isLeaf = true; + // }); + // }); + // // this.sf2.getProperty('/bankAreaArr').schema.enum = data; + // // this.sf2.getProperty('/bankAreaArr').widget.reset(data); + // this.bankRegion = data; + // this.initSF(); + // }); + } + + getProvinceData() { + // return this.service.http.post(this.service.$api_getRegionByCode, { regionCode: '' }).pipe( + // map((res) => { + // return res.data.map((m: { name: any; regionCode: any }) => { + // return { label: m.name, value: m.regionCode }; + // }); + // }), + // ); + } + updateArea(parentId: string, target: string, type: number, nextTarget: string, sfObj: SFComponent): any { + // 改变二级数据时,同时清空三级数据 + if (type === 2 && sfObj) { + sfObj.getProperty(nextTarget)!.schema.enum = []; + sfObj.getProperty(nextTarget)!.widget.reset([]); + sfObj.getProperty(nextTarget)!.setValue(null, true); + } + + if (!parentId && sfObj) { + sfObj.getProperty(target)!.schema.enum = []; + sfObj.getProperty(target)!.widget.reset([]); + sfObj.getProperty(target)!.setValue(null, true); + } else { + // return this.service.http + // .get(this.service.$api_getRegionByCode, { regionCode: parentId }) + // .pipe( + // map((res) => { + // return res.data.map((m: { regionFullName: string; name: any; regionCode: any }) => { + // const fullName = m.regionFullName.split(',').reverse().join(''); + // return { label: m.name, value: m.regionCode, fullName }; + // }); + // }), + // ) + // .subscribe((res) => { + // sfObj.getProperty(target)!.schema.enum = res; + // sfObj.getProperty(target)!.widget.reset(res); + // }); + } + } + getCategoryList() { + // return this.service.http.post(this.service.$api_getCategoryList, { id: '' }).pipe( + // map((data) => { + // return data.data.map((m: { name: any; id: any }) => { + // return { label: m.name, value: m.id }; + // }); + // }), + // ); + // .subscribe((res) => { + // this.sf3.getProperty('/classify').schema.enum = res; + // this.sf3.getProperty('/classify').widget.reset(res || res[0]); + // }); + } + getEnterpriseInfo(id: any) { + // 查询企业信息详情 + const params: any = { + id, + }; + // this.service.http.post(this.service.$api_getEnterpriseInfo, params).subscribe((res) => { + // this.signingPeriod = res.data.signingPeriod; + // }); + } + + + + auditSupplier(contractNo: any) { + // 审核供应商,签署成功需要调此接口 + const params = { + auditStatus: 7, + id: this.id, + contractNum: contractNo, + }; + // this.service.request(this.service.$api_auditSupplier, params).subscribe((res) => { + // this.service.msgSrv.success('签署成功!'); + // this.step = 3; + // this.infoData.auditStatus = 7; + // }); + } + cancel(): void { + this.msg.info('已取消'); + } + /* + * 根据地区code查询地区详情 + * code:请求参数 + * type:参数 name:获取省市区名称,fullcode:获取省市区code + * num:参数 1:第一个地区选择,2:第二个地区选择 + */ + getRegionDetailByCode(code: any) { + // 根据地区code查询地区详情 + // this.service.http.post(this.service.$api_getRegionDetailByCode, { regionCode: code }).subscribe((res) => { + // // 供选择地区保存-获取省市区名称 + // // 第二个地区选择 + + // const a = res.data.regionFullCodes.split(','); + + // this.sf1?.setValue('/region', [+a[0], +a[1], +a[2]]); + // this.enterpriseBusinessAddressCodeStr = res.data.regionFullName.replace(/,/g, ''); + // }); + } + longTime(i: boolean | SFSchemaEnum[], type: string) { + if (type === 'schema') { + if (i) { + // this.sf?.setValue('/validStartTime', Date); + this.sf?.setValue('/validEndTime', Date); + // this.sf.getProperty('/validStartTime').schema.readOnly = true; + this.sf.getProperty('/validEndTime')!.schema.readOnly = true; + } else { + // this.sf.getProperty('/validStartTime').schema.readOnly = false; + this.sf.getProperty('/validEndTime')!.schema.readOnly = false; + } + } + if (type === 'schema1') { + if (i) { + // this.sf1?.setValue('/operatingStartTime', Date); + this.sf1?.setValue('/operatingEndTime', Date); + // this.sf1.getProperty('/operatingStartTime').schema.readOnly = true; + this.sf1.getProperty('/operatingEndTime')!.schema.readOnly = true; + } else { + // this.sf1.getProperty('/operatingStartTime').schema.readOnly = false; + this.sf1.getProperty('/operatingEndTime')!.schema.readOnly = false; + } + } + if (type === 'schema11') { + if (i) { + // this.sf1?.setValue('/validStartTime', Date); + this.sf1?.setValue('/validEndTime', Date); + // this.sf1.getProperty('/validStartTime').schema.readOnly = true; + this.sf1.getProperty('/validEndTime')!.schema.readOnly = true; + } else { + // this.sf1.getProperty('/validStartTime').schema.readOnly = false; + this.sf1.getProperty('/validEndTime')!.schema.readOnly = false; + } + } + } + prev() { + // 返回上一步 + if (this.subStep > 0) { + this.subStep--; + } + if (this.subStep === 2) { + if (this.id) { + this.loadBranchBanks(this.infoData2.bankCode, this.infoData2.bankAddressCode); + } else { + this.loadBrandDist(); + } + } + } + clearData() { + // 重新申请 + const params: any = { + id: this.id, + }; + // this.service.request(this.service.$api_deleteApplyCache, params).subscribe((res) => { + // if (res) { + // this.service.msgSrv.success('已清除申请资料,请重新申请!'); + // this.edit(); + // this.id = ''; + // this.infoData = {}; + // this.infoData1 = {}; + // this.infoData2 = { + // accountName: '', + // }; + // this.infoData3 = {}; + // } + // }); + } + edit() { + this.subStep = 0; + this.getApplicationInfo2(this.routerinfo.snapshot.queryParams.id); + } + goPage(page: string) { + if (page === 'list') { + this.router.navigate(['./account/role']); + } else { + this.router.navigate(['./account/apply-list']); + } + } + goBack() { + window.history.go(-1); + } + onChange(result: Date): void {} + refreshPage() { + window.location.reload(); + } + checkIdCard(imgurl: any, isFront: number, type: number) { + // 识别身份证 参数isFront:0-正面、1-背面;type:0-申请人身份证,1-法定代表人身份证 + const params = { + idCardImagePath: imgurl, + isFront, + }; + // this.service.request(this.service.$api_checkIdCard, params).subscribe((res) => { + // if (res) { + // if (type === 0) { + // // 申请人身份证 + // if (isFront === 0) { + // // 正面 + // if (res.name) { + // this.sf.setValue('/name', res.name); + // } + // if (res.idCardNumber) { + // this.sf.setValue('/certificateNumber', res.idCardNumber); + // } + // } + // if (isFront === 1) { + // // 背面 + // if (res.validFrom) { + // this.sf.setValue('/validStartTime', res.validFrom); + // } + // if (res.validTo) { + // this.sf.setValue('/validEndTime', res.validTo); + // } + // } + // } + // if (type === 1) { + // // 法定代表人身份证 + // if (isFront === 0) { + // // 正面 + // if (res.name) { + // this.sf1.setValue('/name', res.name); + // } + // if (res.idCardNumber) { + // this.sf1.setValue('/certificateNumber', res.idCardNumber); + // } + // } + // if (isFront === 1) { + // // 背面 + // if (res.validFrom) { + // this.sf1.setValue('/validStartTime', res.validFrom); + // } + // if (res.validTo) { + // this.sf1.setValue('/validEndTime', res.validTo); + // } + // } + // } + // } + // }); + } + checkBusinessLicense(imgurl: any) { + // 识别营业执照 + const params = { + licenseImagePath: imgurl, + }; + // this.service.request(this.service.$api_checkBusinessLicense, params).subscribe((res) => { + // if (res) { + // if (res.unifiedSocialCreditCode) { + // this.sf1.setValue('/unifiedSocialCreditCode', res.unifiedSocialCreditCode); + // } + // if (res.enterpriseName) { + // this.sf1.setValue('/enterpriseName', res.enterpriseName); + // } + // if (res.enterpriseType) { + // this.sf1.setValue('/enterpriseType', res.enterpriseType); + // } + // if (res.addressRegionCodes) { + // this.sf1.setValue('/region', res.addressRegionCodes); + // } + // if (res.address) { + // this.sf1.setValue('/enterpriseAddress', res.address); + // } + // if (res.foundDate) { + // this.sf1.setValue('/enterpriseRegistrationTime', res.foundDate); + // } + // if (res.registeredCapital) { + // this.sf1.setValue('/registrationCapital', res.registeredCapital); + // } + // if (res.businessTermStartDate) { + // this.sf1.setValue('/operatingStartTime', res.businessTermStartDate); + // } + // if (res.businessTermEndDate) { + // this.sf1.setValue('/operatingEndTime', res.businessTermEndDate); + // } + // if (res.businessScope) { + // this.sf1.setValue('/businessScope', res.businessScope); + // } + // const len = res.addressRegionCodes.length - 1; + // this.enterpriseAddressCode = res.addressRegionCodes[len]; + // this.enterpriseAddressCodeStr = res.addressRegionNames; + // if (!res.businessTermEndDate) { + // this.sf1.setValue('/dateType', true); + // } + // } + // }); + } + + // resetForm(): void { + // this.infoData.reset(); + // } +} diff --git a/src/app/routes/usercenter/components/driver/view/view.component.html b/src/app/routes/usercenter/components/driver/view/view.component.html new file mode 100644 index 00000000..96d0bc91 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/view/view.component.html @@ -0,0 +1,49 @@ + + + + + + + + + + + + +

道路运输经营许可证

+ +
+ + +
+
+
+ + diff --git a/src/app/routes/usercenter/components/driver/view/view.component.less b/src/app/routes/usercenter/components/driver/view/view.component.less new file mode 100644 index 00000000..48f605d9 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/view/view.component.less @@ -0,0 +1,46 @@ +@import '~@delon/theme/index'; +:host { + ::ng-deep { + .ant-steps-dot { + .ant-steps-item-content { + width: 200px; + } + .ant-steps-item-icon { + margin-left: 96px; + } + .ant-steps-item-tail::after { + margin-left: 40px; + } + } + .success { + color: @success-color; + } + + .warning { + color: @warning-color; + } + + .error { + color: @error-color; + } + } + .mt16 { + margin-top: 16px; + } + .user-info { + display: flex; + font-size: 16px; + .enterprise-name { + margin-right: 15px; + } + img { + width: 64px; + height: 64px; + margin-right: 15px; + border-radius: 50%; + } + .user-info-des { + margin-bottom: 5px; + } + } +} diff --git a/src/app/routes/usercenter/components/driver/view/view.component.spec.ts b/src/app/routes/usercenter/components/driver/view/view.component.spec.ts new file mode 100644 index 00000000..6e2a7782 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/view/view.component.spec.ts @@ -0,0 +1,23 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { FreightComponentsListViewComponent } from './view.component'; + +describe('FreightComponentsListViewComponent', () => { + let component: FreightComponentsListViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FreightComponentsListViewComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FreightComponentsListViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/usercenter/components/driver/view/view.component.ts b/src/app/routes/usercenter/components/driver/view/view.component.ts new file mode 100644 index 00000000..f72bb40a --- /dev/null +++ b/src/app/routes/usercenter/components/driver/view/view.component.ts @@ -0,0 +1,257 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { UsermanageService } from '../../../../services/usercenter.service'; +import { SFComponent, SFSchema, SFDateWidgetSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form'; +import { Observable, Observer } from 'rxjs'; +@Component({ + selector: 'app-Freight-components-list-view', + templateUrl: './view.component.html', + styleUrls: ['./view.component.less'], +}) +export class FreightComponentsListViewComponent implements OnInit { + i: any; + url = `/rule?_allow_anonymous=true`; + + @ViewChild('st', { static: false }) st!: STComponent; + detailData: any = { + status: 0 + }; + isShow = false; + isVisible = false; + modalTitle = '有效期'; + modalName = ''; + ui!: SFUISchema; + schema!: SFSchema; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sf1', { static: false }) sf1!: SFComponent; + validData: any = ['FreightsType']; + FreightsData: any = {}; + + constructor( + private http: _HttpClient, + private modal: ModalHelper, + public service: UsermanageService, + private route: ActivatedRoute, + private modalHelper: ModalHelper, + private msgSrv: NzMessageService, + ) {} + + ngOnInit() { + console.log(this.route.snapshot); + this.initData(); + this.initSF(); + // this.launchSign(); + } + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + name: { + title: '许可证号', + type: 'string', + maxLength: 20, + ui: { + placeholder: '请输入角色名称', + }, + }, + phone: { + title: '业户名称', + type: 'string', + maxLength: 20, + ui: { + placeholder: '请输入业户名称', + }, + }, + roleDescription: { + title: '地址', + type: 'string', + maxLength: 30, + ui: { + placeholder: '请输入地址', + widget: 'textarea', + }, + }, + effectiveDate: { + title: '发证日期', + type: 'string', + ui: { + widget: 'date', + format: 'yyyy-MM-dd 00:00:00', + // hidden: this.modalName === 'effectiveDate' ? false : true, + } as SFDateWidgetSchema, + }, + phone3: { + title: '有效期', + type: 'string', + ui: { + placeholder: '请输入业户名称', + }, + }, + phone4: { + title: '有效期截止', + type: 'string', + ui: { + placeholder: '请输入业户名称', + }, + }, + phone5: { + title: '经营范围', + type: 'string', + ui: { + placeholder: '请输入业户名称', + }, + }, + avatar: { + type: 'string', + title: '证照', + ui: { + // action: environment.UPLOAD_URL, + fileType: 'image/png,image/jpeg,image/jpg,image/png,image/gif,image/bmp', + limit: 1, + limitFileCount: 1, + resReName: 'url', + urlReName: 'url', + widget: 'upload', + descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', + data: { + // appId: environment.appId, + }, + name: 'multipartFile', + multiple: false, + listType: 'picture-card', + change: (args) => { + if (args.type === 'success') { + const avatar = [ + { + uid: -1, + name: 'LOGO', + status: 'done', + url: args.fileList[0].response.url, + response: { + url: args.fileList[0].response.url, + }, + }, + ]; + this.sf?.setValue('/avatar', avatar); + } + }, + beforeUpload: (file: any, _fileList) => { + return new Observable((observer: Observer) => { + const isLt2M = file.size / 1024 / 1024 < 5; + if (!isLt2M) { + this.service.msgSrv.warning('图片大小超过5M!'); + observer.complete(); + return; + } + observer.next(isLt2M); + observer.complete(); + }); + }, + } as SFUploadWidgetSchema, + }, + }, + required: ['name', 'phone'], + }; + this.ui = { '*': { spanLabelFixed: 200, grid: {offset:4, span: 12 } } }; + } + showModal(name: any) { + this.modalName = name; + if (name === 'effectiveDate') { + this.isShow = true; + } else { + this.isVisible = true; + } + } + async initData() { + console.log(this.route.snapshot, 'this.route.snapshot'); + + const params = { + tenantId: this.route.snapshot.params.id, + }; + } + + /** + * 根据地区code查询地区详情 + * @param code 地区代码 + */ + async getRegionFullName(code: any) { + const params = { + regionCode: code, + }; + const res = await this.service.asyncRequest(this.service.$api_get_region_detailByCode, params, 'POST', true); + // if (res && res.regionFullName) { + // const arr = res.regionFullName.split(','); + // res.regionFullName = arr.reverse().join('-'); + // } + return res && res.regionFullName; + } + add() { + // this.modal + // .createStatic(FormEditComponent, { i: { id: 0 } }) + // .subscribe(() => this.st.reload()); + } + goBack() { + window.history.go(-1); + } + /** + * 冻结 + */ + freezeOrResume(type: number) { + this.service.http + .post(this.service.$api_set_freezeOrResume, { + tenantId: this.route.snapshot.params.id, + // tenantId: this.route.snapshot.queryParams.tenantId, + status: type, + }) + .subscribe((res) => { + if (res.data === true) { + if (type === 0) { + this.service.msgSrv.success(`启用成功!`); + } else if (type === 1) { + this.service.msgSrv.success(`冻结成功!`); + } + this.ngOnInit(); + } else { + this.service.msgSrv.error(res.msg || '操作失败!'); + } + }); + } + + handleCancel(name: any) { + if (name === 'effectiveDate') { + this.isShow = false; + } else { + this.isVisible = false; + } + } + handleOK(name: any) { + const params: any = { + tenantId: this.route.snapshot.params.id, + // tenantId: this.route.snapshot.queryParams.tenantId, + }; + + if (name === 'effectiveDate') { + params.effectiveDate = this.sf?.value?.effectiveDate; + } else { + Object.assign(params, this.sf1?.value); + } + this.service.http.post(this.service.$api_set_freezeOrResume, params).subscribe((res) => { + if (res.data === true) { + this.service.msgSrv.success(`编辑成功!`); + this.ngOnInit(); + } else { + this.service.msgSrv.error(res.msg || '编辑失败!'); + } + if (name === 'effectiveDate') { + this.isShow = false; + } else { + this.isVisible = false; + } + }); + } +} diff --git a/src/app/routes/usercenter/components/freight/user/detail/detail.component.html b/src/app/routes/usercenter/components/freight/user/detail/detail.component.html index e482b927..7fb2620c 100644 --- a/src/app/routes/usercenter/components/freight/user/detail/detail.component.html +++ b/src/app/routes/usercenter/components/freight/user/detail/detail.component.html @@ -1,7 +1,7 @@ +
+
关联企业 - + + diff --git a/src/app/routes/usercenter/components/freight/user/detail/detail.component.ts b/src/app/routes/usercenter/components/freight/user/detail/detail.component.ts index c9306724..c76be624 100644 --- a/src/app/routes/usercenter/components/freight/user/detail/detail.component.ts +++ b/src/app/routes/usercenter/components/freight/user/detail/detail.component.ts @@ -15,7 +15,20 @@ export class FreightComponentsUserDetailComponent implements OnInit { i: any; url = `/rule?_allow_anonymous=true`; @ViewChild('st', { static: false }) st!: STComponent; - detailData: any; + detailData: any = { + goodsList: [ + { + perPrice: '22323', + goodsQuantity: '项目名称', + totalPrice: '角色', + }, + { + perPrice: '2259595', + goodsQuantity: '项目名称2', + totalPrice: '角色', + }, + ] + }; isShow = false; isVisible = false; modalTitle = '有效期'; @@ -27,7 +40,11 @@ export class FreightComponentsUserDetailComponent implements OnInit { @ViewChild('sf1', { static: false }) sf1!: SFComponent; validData: any = ['suppliersType']; suppliersData: any = {}; - + columns: STColumn[] = [ + { title: '企业名称', index: 'perPrice', width: 300, className: 'text-center' }, + { title: '项目名称', index: 'goodsQuantity', width: 300, className: 'text-center' }, + { title: '角色', index: 'totalPrice', width: 300, className: 'text-center' }, + ]; constructor( private http: _HttpClient, private modal: ModalHelper, diff --git a/src/app/routes/usercenter/components/freight/user/user.component.ts b/src/app/routes/usercenter/components/freight/user/user.component.ts index d156e00f..b0b832aa 100644 --- a/src/app/routes/usercenter/components/freight/user/user.component.ts +++ b/src/app/routes/usercenter/components/freight/user/user.component.ts @@ -212,7 +212,7 @@ export class FreightComponentsUserComponent implements OnInit { { text: '启用', click: (item) => { - this.isVisibleOpen = false + this.isVisibleOpen = true console.log(item) }, }, diff --git a/src/app/routes/usercenter/usercenter-routing.module.ts b/src/app/routes/usercenter/usercenter-routing.module.ts index df1ef699..6fc28071 100644 --- a/src/app/routes/usercenter/usercenter-routing.module.ts +++ b/src/app/routes/usercenter/usercenter-routing.module.ts @@ -1,13 +1,14 @@ /* * @Author: your name * @Date: 2021-11-29 15:22:34 - * @LastEditTime: 2021-11-30 15:55:44 + * @LastEditTime: 2021-11-30 17:00:50 * @LastEditors: Please set LastEditors * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: \tms-obc-web\src\app\routes\usercenter\usercenter-routing.module.ts */ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; +import { UserCenterComponentsDriverComponent } from './components/driver/driver.component'; import { FreightComponentsEnterpriseAuditComponent } from './components/freight/enterprise-audit/enterprise-audit.component'; import { FreightComponentsEnterpriseAuditViewComponent } from './components/freight/enterprise-audit/view/view.component'; import { FreightComponentsListDetailComponent } from './components/freight/list/detail/detail.component'; @@ -29,6 +30,7 @@ const routes: Routes = [ { path: 'freight/enterprise/view/:id', component: FreightComponentsEnterpriseAuditViewComponent }, { path: 'freight/user', component: FreightComponentsUserComponent }, { path: 'freight/user/view/:id', component: FreightComponentsUserDetailComponent }, + { path: 'driver', component: UserCenterComponentsDriverComponent }, ]; @NgModule({ diff --git a/src/app/routes/usercenter/usercenter.module.ts b/src/app/routes/usercenter/usercenter.module.ts index 14677a6d..197f6ff1 100644 --- a/src/app/routes/usercenter/usercenter.module.ts +++ b/src/app/routes/usercenter/usercenter.module.ts @@ -1,13 +1,14 @@ /* * @Author: your name * @Date: 2021-11-29 15:22:34 - * @LastEditTime: 2021-11-30 09:54:18 + * @LastEditTime: 2021-11-30 17:00:19 * @LastEditors: Please set LastEditors * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: \tms-obc-web\src\app\routes\usercenter\usercenter.module.ts */ import { NgModule } from '@angular/core'; import { SharedModule } from '@shared'; +import { UserCenterComponentsDriverComponent } from './components/driver/driver.component'; import { FreightComponentsEnterpriseAuditComponent } from './components/freight/enterprise-audit/enterprise-audit.component'; import { FreightComponentsEnterpriseAuditViewComponent } from './components/freight/enterprise-audit/view/view.component'; import { FreightComponentsListDetailComponent } from './components/freight/list/detail/detail.component'; @@ -26,7 +27,8 @@ const COMPONENTS = [ FreightComponentsEnterpriseAuditComponent, FreightComponentsEnterpriseAuditViewComponent, FreightComponentsUserComponent, - FreightComponentsUserDetailComponent + FreightComponentsUserDetailComponent, + UserCenterComponentsDriverComponent ]; @NgModule({ diff --git a/src/assets/mocks/menu-data.json b/src/assets/mocks/menu-data.json index 52853792..6b47362c 100644 --- a/src/assets/mocks/menu-data.json +++ b/src/assets/mocks/menu-data.json @@ -76,8 +76,19 @@ "link": "/usercenter/freight/user" } ] - } + }, + { + "text": "司机管理", + "icon": "anticon anticon-dashboard", + "link": "/demo/zorro", + "children": [ + { + "text": "司机列表", + "icon": "anticon anticon-dashboard", + "link": "/usercenter/driver" + } ] + }] }, { "text": "系统设置", From 8aca1f7b83727f1bde80d98f2128f70ed7d646e4 Mon Sep 17 00:00:00 2001 From: Taric Xin Date: Tue, 30 Nov 2021 19:42:42 +0800 Subject: [PATCH 0013/1600] edit --- .../audit-reason-config.component.html | 28 +++ .../audit-reason-config.component.less | 21 +++ .../audit-reason-config.component.ts | 127 +++++++++++++ ...t-reson-config-action-modal.component.html | 11 ++ ...t-reson-config-action-modal.component.less | 0 ...dit-reson-config-action-modal.component.ts | 94 ++++++++++ .../basic-config-action-modal.component.html | 11 ++ .../basic-config-action-modal.component.less | 0 .../basic-config-action-modal.component.ts | 106 +++++++++++ .../basic-config/basic-config.component.html | 29 +++ .../basic-config/basic-config.component.less | 13 ++ .../basic-config/basic-config.component.ts | 128 +++++++++++++ .../cart-config-action-modal.component.html | 11 ++ .../cart-config-action-modal.component.less | 0 .../cart-config-action-modal.component.ts | 123 +++++++++++++ .../cart-config/cart-config.component.html | 33 ++++ .../cart-config/cart-config.component.less | 21 +++ .../cart-config/cart-config.component.ts | 174 ++++++++++++++++++ .../role-management.component.html | 29 +++ .../role-management.component.less | 13 ++ .../role-management.component.ts | 81 ++++++++ .../system-logs/system-logs.component.html | 27 +++ .../system-logs/system-logs.component.less | 21 +++ .../system-logs/system-logs.component.ts | 109 +++++++++++ .../user-logs/user-logs.component.html | 27 +++ .../user-logs/user-logs.component.less | 21 +++ .../user-logs/user-logs.component.ts | 115 ++++++++++++ .../version-logs/version-logs.component.html | 27 +++ .../version-logs/version-logs.component.less | 21 +++ .../version-logs/version-logs.component.ts | 109 +++++++++++ .../sys-setting/sys-setting-routing.module.ts | 18 +- .../routes/sys-setting/sys-setting.module.ts | 30 ++- src/assets/mocks/menu-data.json | 22 ++- 33 files changed, 1588 insertions(+), 12 deletions(-) create mode 100644 src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.html create mode 100644 src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.less create mode 100644 src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.ts create mode 100644 src/app/routes/sys-setting/components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component.html create mode 100644 src/app/routes/sys-setting/components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component.less create mode 100644 src/app/routes/sys-setting/components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component.ts create mode 100644 src/app/routes/sys-setting/components/basic-config/basic-config-action-modal/basic-config-action-modal.component.html create mode 100644 src/app/routes/sys-setting/components/basic-config/basic-config-action-modal/basic-config-action-modal.component.less create mode 100644 src/app/routes/sys-setting/components/basic-config/basic-config-action-modal/basic-config-action-modal.component.ts create mode 100644 src/app/routes/sys-setting/components/basic-config/basic-config.component.html create mode 100644 src/app/routes/sys-setting/components/basic-config/basic-config.component.less create mode 100644 src/app/routes/sys-setting/components/basic-config/basic-config.component.ts create mode 100644 src/app/routes/sys-setting/components/cart-config/cart-config-action-modal/cart-config-action-modal.component.html create mode 100644 src/app/routes/sys-setting/components/cart-config/cart-config-action-modal/cart-config-action-modal.component.less create mode 100644 src/app/routes/sys-setting/components/cart-config/cart-config-action-modal/cart-config-action-modal.component.ts create mode 100644 src/app/routes/sys-setting/components/cart-config/cart-config.component.html create mode 100644 src/app/routes/sys-setting/components/cart-config/cart-config.component.less create mode 100644 src/app/routes/sys-setting/components/cart-config/cart-config.component.ts create mode 100644 src/app/routes/sys-setting/components/role-management/role-management.component.html create mode 100644 src/app/routes/sys-setting/components/role-management/role-management.component.less create mode 100644 src/app/routes/sys-setting/components/role-management/role-management.component.ts create mode 100644 src/app/routes/sys-setting/components/system-logs/system-logs.component.html create mode 100644 src/app/routes/sys-setting/components/system-logs/system-logs.component.less create mode 100644 src/app/routes/sys-setting/components/system-logs/system-logs.component.ts create mode 100644 src/app/routes/sys-setting/components/user-logs/user-logs.component.html create mode 100644 src/app/routes/sys-setting/components/user-logs/user-logs.component.less create mode 100644 src/app/routes/sys-setting/components/user-logs/user-logs.component.ts create mode 100644 src/app/routes/sys-setting/components/version-logs/version-logs.component.html create mode 100644 src/app/routes/sys-setting/components/version-logs/version-logs.component.less create mode 100644 src/app/routes/sys-setting/components/version-logs/version-logs.component.ts diff --git a/src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.html b/src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.html new file mode 100644 index 00000000..05954155 --- /dev/null +++ b/src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.html @@ -0,0 +1,28 @@ + + + + +
+
+ +
+
+ + +
+
+
+ + +
+
+ +
+
+ +
\ No newline at end of file diff --git a/src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.less b/src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.less new file mode 100644 index 00000000..80d9010f --- /dev/null +++ b/src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.less @@ -0,0 +1,21 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 14px; + } + } + + nz-range-picker { + width: 100%; + } +} + +.expend-options { + margin-top: -40px; +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.ts b/src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.ts new file mode 100644 index 00000000..12b92bed --- /dev/null +++ b/src/app/routes/sys-setting/components/audit-reason-config/audit-reason-config.component.ts @@ -0,0 +1,127 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STChange, STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../services/system.service'; +import { AuditResonConfigActionModalComponent } from './audit-reson-config-action-modal/audit-reson-config-action-modal.component'; + +@Component({ + selector: 'app-audit-reason-config', + templateUrl: './audit-reason-config.component.html', + styleUrls: ['./audit-reason-config.component.less'] +}) +export class AuditReasonConfigComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + url = `/rule?_allow_anonymous=true`; + + searchSchema: SFSchema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + receiveName: { + type: 'string', + title: '审核类型', + enum: [ + { label: '全部', value: '全部' }, + { label: '企业认证审核', value: '企业认证审核' }, + { label: '企业管理员审核', value: '企业管理员审核' }, + { label: '用户实名认证审核', value: '用户实名认证审核' }, + { label: '司机实名认证审核', value: '司机实名认证审核' }, + { label: '司机驾驶证审核', value: '司机驾驶证审核' }, + { label: '车辆审核', value: '车辆审核' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName = i; + this.sf?.setValue('/receiveName', i); + } + } + }, + phone: { + type: 'string', + title: '驳回理由', + ui: { placeholder: '请输入' } + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema + } + } + }; + + columns: STColumn[] = [ + { title: '操作时间', index: 'updatedAt', type: 'date' }, + { title: '操作人', index: 'description' }, + { title: '操作人手机号码', index: 'description' }, + { title: '操作页面', index: 'description' }, + { title: '操作内容', index: 'description' }, + { + title: '创建时间', + index: 'updatedAt', + type: 'date' + }, + { + title: '操作', + buttons: [ + { + text: '编辑', + click: item => this.reasonAction(item) + }, + { + text: '删除', + click: item => this.deleteReason(item) + } + ] + } + ]; + + reqParams = { pageIndex: 1, pageSize: 10 }; + + constructor(public service: SystemService, private nzModalService: NzModalService) {} + + ngOnInit(): void {} + + stChange(e: STChange): void {} + + reasonAction(item?: any) { + const modal = this.nzModalService.create({ + nzContent: AuditResonConfigActionModalComponent, + nzComponentParams: item ? { i: { ...item, roleId: 1, name: '车辆审核', phone: 18555555555 } } : { i: { id: 0 } }, + nzFooter: null + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + + deleteReason(item: any) { + this.nzModalService.error({ + nzTitle: '确认删除?', + nzClosable: false, + nzCancelText: '取消', + nzOnOk: () => {} + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } +} diff --git a/src/app/routes/sys-setting/components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component.html b/src/app/routes/sys-setting/components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component.html new file mode 100644 index 00000000..beead4d9 --- /dev/null +++ b/src/app/routes/sys-setting/components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component.html @@ -0,0 +1,11 @@ + +
+ + +
+ \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component.less b/src/app/routes/sys-setting/components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/sys-setting/components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component.ts b/src/app/routes/sys-setting/components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component.ts new file mode 100644 index 00000000..ea2449a9 --- /dev/null +++ b/src/app/routes/sys-setting/components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component.ts @@ -0,0 +1,94 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../../services/system.service'; + +@Component({ + selector: 'app-audit-reson-config-action-modal', + templateUrl: './audit-reson-config-action-modal.component.html', + styleUrls: ['./audit-reson-config-action-modal.component.less'] +}) +export class AuditResonConfigActionModalComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + i: any; + schema!: SFSchema; + ui: SFUISchema = { + '*': { + spanLabelFixed: 120, + grid: { span: 24 } + } + }; + constructor(private modal: NzModalRef, public service: SystemService) {} + + ngOnInit(): void { + this.initSF(this.i); + } + initSF(staff: any) { + this.schema = { + properties: { + name: { + title: '选择审核类型', + type: 'string', + enum: [ + { label: '全部', value: '全部' }, + { label: '企业认证审核', value: '企业认证审核' }, + { label: '企业管理员审核', value: '企业管理员审核' }, + { label: '用户实名认证审核', value: '用户实名认证审核' }, + { label: '司机实名认证审核', value: '司机实名认证审核' }, + { label: '司机驾驶证审核', value: '司机驾驶证审核' }, + { label: '车辆审核', value: '车辆审核' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.name = i; + this.sf?.setValue('/name', i); + } + }, + default: staff.name + }, + phone: { + title: '驳回理由', + type: 'string', + ui: { placeholder: '请输入', widget: 'textarea', autosize: { minRows: 2, maxRows: 6 } }, + default: staff.phone + } + }, + required: ['name'] + }; + } + + sure() { + if (this.i.id === 0) { + const params: any = { + ...this.sf.value, + roleId: this.sf.value.roleId, + telephone: this.sf.value.phone, + staffName: this.sf.value.name + }; + // this.service.request(this.service.$api_addStaff, params).subscribe((res) => { + // console.log(res); + // if (res) { + // this.service.msgSrv.success('保存成功!'); + // this.modal.close(true); + // } + // // this.showInviteFlag = true; + // // this.inviteCode = res.inviteCode; + // }); + } else { + const params: any = { + appUserId: this.i.appUserId, + staffName: this.sf.value.name, + roleId: this.sf.value.roleId, + telephone: this.i.telephone + }; + } + } + + close() { + this.modal.destroy(); + } +} diff --git a/src/app/routes/sys-setting/components/basic-config/basic-config-action-modal/basic-config-action-modal.component.html b/src/app/routes/sys-setting/components/basic-config/basic-config-action-modal/basic-config-action-modal.component.html new file mode 100644 index 00000000..beead4d9 --- /dev/null +++ b/src/app/routes/sys-setting/components/basic-config/basic-config-action-modal/basic-config-action-modal.component.html @@ -0,0 +1,11 @@ + +
+ + +
+ \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/basic-config/basic-config-action-modal/basic-config-action-modal.component.less b/src/app/routes/sys-setting/components/basic-config/basic-config-action-modal/basic-config-action-modal.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/sys-setting/components/basic-config/basic-config-action-modal/basic-config-action-modal.component.ts b/src/app/routes/sys-setting/components/basic-config/basic-config-action-modal/basic-config-action-modal.component.ts new file mode 100644 index 00000000..0b999760 --- /dev/null +++ b/src/app/routes/sys-setting/components/basic-config/basic-config-action-modal/basic-config-action-modal.component.ts @@ -0,0 +1,106 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFRadioWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../../services/system.service'; + +@Component({ + selector: 'app-basic-config-action-modal', + templateUrl: './basic-config-action-modal.component.html', + styleUrls: ['./basic-config-action-modal.component.less'] +}) +export class BasicConfigActionModalComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + i: any; + schema!: SFSchema; + ui: SFUISchema = { + '*': { + spanLabelFixed: 120, + grid: { span: 24 } + } + }; + constructor(private modal: NzModalRef,public service: SystemService) {} + + ngOnInit(): void { + this.initSF(this.i); + } + initSF(staff: any) { + this.schema = { + properties: { + name: { + title: '配置类型', + type: 'string', + enum: [ + { label: '全部', value: '全部' }, + { label: '企业认证审核', value: '企业认证审核' }, + { label: '企业管理员审核', value: '企业管理员审核' }, + { label: '用户实名认证审核', value: '用户实名认证审核' }, + { label: '司机实名认证审核', value: '司机实名认证审核' }, + { label: '司机驾驶证审核', value: '司机驾驶证审核' }, + { label: '车辆审核', value: '车辆审核' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.name = i; + this.sf?.setValue('/name', i); + } + }, + default: staff.name + }, + phone: { + title: '配置项', + type: 'string', + ui: { placeholder: '请输入' }, + default: staff.phone + }, + roleId: { + type: 'string', + title: '启用状态', + enum: [ + { label: '启用', value: 1 }, + { label: '停用', value: 0 } + ], + ui: { + widget: 'radio' + } as SFRadioWidgetSchema, + default: staff?.roleId || 1 + } + }, + required: ['name', 'phone', 'roleId'] + }; + } + + sure() { + if (this.i.id === 0) { + const params: any = { + ...this.sf.value, + roleId: this.sf.value.roleId, + telephone: this.sf.value.phone, + staffName: this.sf.value.name + }; + // this.service.request(this.service.$api_addStaff, params).subscribe((res) => { + // console.log(res); + // if (res) { + // this.service.msgSrv.success('保存成功!'); + // this.modal.close(true); + // } + // // this.showInviteFlag = true; + // // this.inviteCode = res.inviteCode; + // }); + } else { + const params: any = { + appUserId: this.i.appUserId, + staffName: this.sf.value.name, + roleId: this.sf.value.roleId, + telephone: this.i.telephone + }; + } + } + + close() { + this.modal.destroy(); + } +} diff --git a/src/app/routes/sys-setting/components/basic-config/basic-config.component.html b/src/app/routes/sys-setting/components/basic-config/basic-config.component.html new file mode 100644 index 00000000..96cbbf2e --- /dev/null +++ b/src/app/routes/sys-setting/components/basic-config/basic-config.component.html @@ -0,0 +1,29 @@ + + + + +
+
+ +
+
+ + +
+
+
+ + + +
+
+ +
+
+ +
\ No newline at end of file diff --git a/src/app/routes/sys-setting/components/basic-config/basic-config.component.less b/src/app/routes/sys-setting/components/basic-config/basic-config.component.less new file mode 100644 index 00000000..04fd4ba3 --- /dev/null +++ b/src/app/routes/sys-setting/components/basic-config/basic-config.component.less @@ -0,0 +1,13 @@ +:host::ng-deep{ + .search-box{ + .ant-card-body{ + padding-bottom: 18px; + } + } + + .content-box{ + .ant-card-body{ + padding-top: 14px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/basic-config/basic-config.component.ts b/src/app/routes/sys-setting/components/basic-config/basic-config.component.ts new file mode 100644 index 00000000..8b540f2e --- /dev/null +++ b/src/app/routes/sys-setting/components/basic-config/basic-config.component.ts @@ -0,0 +1,128 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../services/system.service'; +import { BasicConfigActionModalComponent } from './basic-config-action-modal/basic-config-action-modal.component'; + +@Component({ + selector: 'app-basic-config', + templateUrl: './basic-config.component.html', + styleUrls: ['./basic-config.component.less'] +}) +export class BasicConfigComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + url = `/rule?_allow_anonymous=true`; + + searchSchema: SFSchema = { + properties: { + receiveName: { + title: '配置类型', + type: 'string', + ui: { + widget: 'select', + placeholder: '请选择', + // asyncData: () => { + // return this.service.request(this.service.$api_getAppRoleList).pipe( + // map((res: any) => { + // this.roleList = res; + // return res.map((item: any) => { + // return { label: item.roleName, value: item.id }; + // }); + // }), + // ); + // }, + change: (i: any) => { + this.sf.value.receiveName = i; + this.sf?.setValue('/receiveName', i); + } + } + } + } + }; + + columns: STColumn[] = [ + { title: '配置类型', index: 'no' }, + { title: '配置项', index: 'description' }, + { + title: '启用状态', + className: 'text-center', + index: 'status', + type: 'badge', + badge: { + 0: { text: '启用', color: 'success' }, + 2: { text: '停用', color: 'error' }, + 3: { text: '停用', color: 'error' }, + 1: { text: '停用', color: 'error' } + } + }, + { + title: '创建时间', + index: 'updatedAt', + type: 'date' + }, + { + title: '操作', + buttons: [ + { + text: '编辑', + click: item => this.configAction(item) + }, + { + text: '停用', + click: item => this.deactivateConfig(item) + } + ] + } + ]; + + selectedRows: any[] = []; + + reqParams = { pageIndex: 1, pageSize: 10 }; + + constructor(public service: SystemService, private nzModalService: NzModalService) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st.load(); + break; + } + } + + configAction(item?: any) { + const modal = this.nzModalService.create({ + nzContent: BasicConfigActionModalComponent, + nzComponentParams: item ? { i: { ...item, roleId: 1, name: '车辆审核', phone: 18555555555 } } : { i: { id: 0 } }, + nzFooter: null + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + + deactivateConfig(item?: any) { + this.nzModalService.error({ + nzTitle: '确认停用?', + nzContent: ``, + nzClosable: false, + nzCancelText: '取消', + nzOnOk: () => {} + }); + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } +} diff --git a/src/app/routes/sys-setting/components/cart-config/cart-config-action-modal/cart-config-action-modal.component.html b/src/app/routes/sys-setting/components/cart-config/cart-config-action-modal/cart-config-action-modal.component.html new file mode 100644 index 00000000..beead4d9 --- /dev/null +++ b/src/app/routes/sys-setting/components/cart-config/cart-config-action-modal/cart-config-action-modal.component.html @@ -0,0 +1,11 @@ + +
+ + +
+ \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/cart-config/cart-config-action-modal/cart-config-action-modal.component.less b/src/app/routes/sys-setting/components/cart-config/cart-config-action-modal/cart-config-action-modal.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/sys-setting/components/cart-config/cart-config-action-modal/cart-config-action-modal.component.ts b/src/app/routes/sys-setting/components/cart-config/cart-config-action-modal/cart-config-action-modal.component.ts new file mode 100644 index 00000000..3dc63a29 --- /dev/null +++ b/src/app/routes/sys-setting/components/cart-config/cart-config-action-modal/cart-config-action-modal.component.ts @@ -0,0 +1,123 @@ +import { Component, Input, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFRadioWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../../services/system.service'; + +@Component({ + selector: 'app-cart-config-action-modal', + templateUrl: './cart-config-action-modal.component.html', + styleUrls: ['./cart-config-action-modal.component.less'] +}) +export class CartConfigActionModalComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + i: any; + schema!: SFSchema; + ui: SFUISchema = { + '*': { + spanLabelFixed: 120, + grid: { span: 24 } + } + }; + @Input() + configType: number = 1; + constructor(private modal: NzModalRef, public service: SystemService) {} + + ngOnInit(): void { + this.initSF(this.i); + console.log(this.configType); + } + initSF(staff: any) { + let required: any = []; + switch (this.configType) { + case 1: + required = ['phone1']; + break; + case 2: + required = ['phone2']; + break; + case 3: + required = ['phone3']; + break; + + default: + break; + } + this.schema = { + properties: { + phone1: { + title: '车型', + type: 'string', + ui: { + placeholder: '请输入', + hidden: this.configType === 2 || this.configType === 3 + }, + default: staff.phone1 + }, + phone2: { + title: '车长', + type: 'string', + ui: { + placeholder: '请输入', + hidden: this.configType === 1 || this.configType === 3 + }, + default: staff.phone2 + }, + phone3: { + title: '物品名称', + type: 'string', + ui: { + placeholder: '请输入', + hidden: this.configType === 1 || this.configType === 2 + }, + default: staff.phone3 + }, + roleId: { + type: 'string', + title: '状态', + enum: [ + { label: '启用', value: 1 }, + { label: '停用', value: 0 } + ], + ui: { + widget: 'radio' + } as SFRadioWidgetSchema, + default: staff?.roleId || 1 + } + }, + required: required + }; + } + + sure() { + if (this.i.id === 0) { + const params: any = { + ...this.sf.value, + roleId: this.sf.value.roleId, + telephone: this.sf.value.phone, + staffName: this.sf.value.name + }; + // this.service.request(this.service.$api_addStaff, params).subscribe((res) => { + // console.log(res); + // if (res) { + // this.service.msgSrv.success('保存成功!'); + // this.modal.close(true); + // } + // // this.showInviteFlag = true; + // // this.inviteCode = res.inviteCode; + // }); + } else { + const params: any = { + appUserId: this.i.appUserId, + staffName: this.sf.value.name, + roleId: this.sf.value.roleId, + telephone: this.i.telephone + }; + } + } + + close() { + this.modal.destroy(); + } +} diff --git a/src/app/routes/sys-setting/components/cart-config/cart-config.component.html b/src/app/routes/sys-setting/components/cart-config/cart-config.component.html new file mode 100644 index 00000000..755e4a0a --- /dev/null +++ b/src/app/routes/sys-setting/components/cart-config/cart-config.component.html @@ -0,0 +1,33 @@ + + + + + + + + + +
+
+ +
+
+ + +
+
+
+ + +
+
+ +
+
+ +
\ No newline at end of file diff --git a/src/app/routes/sys-setting/components/cart-config/cart-config.component.less b/src/app/routes/sys-setting/components/cart-config/cart-config.component.less new file mode 100644 index 00000000..72efc9a9 --- /dev/null +++ b/src/app/routes/sys-setting/components/cart-config/cart-config.component.less @@ -0,0 +1,21 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 14px; + } + } + + .tabs-wrap>.ant-tabs-nav { + margin-bottom: 0; + } + + h1 { + margin: 0; + } +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/cart-config/cart-config.component.ts b/src/app/routes/sys-setting/components/cart-config/cart-config.component.ts new file mode 100644 index 00000000..b56ee7a1 --- /dev/null +++ b/src/app/routes/sys-setting/components/cart-config/cart-config.component.ts @@ -0,0 +1,174 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../services/system.service'; +import { CartConfigActionModalComponent } from './cart-config-action-modal/cart-config-action-modal.component'; + +@Component({ + selector: 'app-cart-config', + templateUrl: './cart-config.component.html', + styleUrls: ['./cart-config.component.less'] +}) +export class CartConfigComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + tabs = [ + { + name: '车型配置', + type: 1, + isActived: false + }, + { + name: '车长配置', + type: 2, + isActived: false + }, + { + name: '禁限物品名单', + type: 3, + isActived: false + } + ]; + tabType = 1; + url = `/rule?_allow_anonymous=true`; + + searchSchema: SFSchema = { + properties: { + tabType: { + type: 'number', + ui: { + hidden: true + } + }, + params1: { + title: '车型', + type: 'string', + ui: { + placeholder: '请输入', + visibleIf: { + tabType: (value: number) => this.tabType === 1 + } + } + }, + params2: { + title: '车长', + type: 'string', + ui: { + placeholder: '请输入', + visibleIf: { + tabType: (value: number) => this.tabType === 2 + } + } + }, + params3: { + title: '物品名称', + type: 'string', + ui: { + placeholder: '请输入', + visibleIf: { + tabType: (value: number) => this.tabType === 3 + } + } + } + } + }; + + columns: STColumn[] = [ + { title: '车型', index: 'no', iif: () => this.tabType === 1 }, + { title: '车长', index: 'no', iif: () => this.tabType === 2 }, + { title: '物品名称', index: 'no', iif: () => this.tabType === 3 }, + { + title: '启用状态', + className: 'text-center', + index: 'status', + type: 'badge', + badge: { + 0: { text: '启用', color: 'success' }, + 2: { text: '禁用', color: 'error' }, + 3: { text: '禁用', color: 'error' }, + 1: { text: '禁用', color: 'error' } + } + }, + { + title: '创建时间', + index: 'updatedAt', + type: 'date' + }, + { + title: '操作', + buttons: [ + { + text: '编辑', + click: item => this.configAction(item) + }, + { + text: '删除', + click: item => this.deleteAction(item) + } + ] + } + ]; + + selectedRows: any[] = []; + + reqParams = { pageIndex: 1, pageSize: 10 }; + + constructor(public service: SystemService, private nzModalService: NzModalService) {} + + ngOnInit(): void {} + + // 切换Tab + changeTab(item: any) { + this.tabType = item.type; + this.sf?.setValue('/tabType', item.type); + this.sf?.reset(); + setTimeout(() => { + this.tabs.forEach(i => (i.isActived = false)); + item.isActived = !item.isActived; + this.st.load(1); + this.st.resetColumns(); + }, 500); + } + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st.load(); + break; + } + } + + configAction(item?: any) { + const modal = this.nzModalService.create({ + nzContent: CartConfigActionModalComponent, + nzComponentParams: item + ? { i: { ...item, roleId: 1, phone1: '车辆审核', phone2: '车辆审核', phone3: '车辆审核' }, configType: this.tabType } + : { i: { id: 0 }, configType: this.tabType }, + nzFooter: null + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + + deleteAction(item?: any) { + this.nzModalService.error({ + nzTitle: '确认删除?', + nzClosable: false, + nzCancelText: '取消', + nzOnOk: () => {} + }); + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } +} diff --git a/src/app/routes/sys-setting/components/role-management/role-management.component.html b/src/app/routes/sys-setting/components/role-management/role-management.component.html new file mode 100644 index 00000000..f6339284 --- /dev/null +++ b/src/app/routes/sys-setting/components/role-management/role-management.component.html @@ -0,0 +1,29 @@ + + + + +
+
+ +
+
+ + +
+
+
+ + + +
+
+ +
+
+ +
\ No newline at end of file diff --git a/src/app/routes/sys-setting/components/role-management/role-management.component.less b/src/app/routes/sys-setting/components/role-management/role-management.component.less new file mode 100644 index 00000000..04fd4ba3 --- /dev/null +++ b/src/app/routes/sys-setting/components/role-management/role-management.component.less @@ -0,0 +1,13 @@ +:host::ng-deep{ + .search-box{ + .ant-card-body{ + padding-bottom: 18px; + } + } + + .content-box{ + .ant-card-body{ + padding-top: 14px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/role-management/role-management.component.ts b/src/app/routes/sys-setting/components/role-management/role-management.component.ts new file mode 100644 index 00000000..c0ba32d1 --- /dev/null +++ b/src/app/routes/sys-setting/components/role-management/role-management.component.ts @@ -0,0 +1,81 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../services/system.service'; + +@Component({ + selector: 'app-role-management', + templateUrl: './role-management.component.html', + styleUrls: ['./role-management.component.less'] +}) +export class RoleManagementComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + url = `/rule?_allow_anonymous=true`; + + searchSchema: SFSchema = { + properties: { + receiveName: { + type: 'string', + title: '角色名称', + ui: { placeholder: '请输入' } + } + } + }; + + columns: STColumn[] = [ + { title: '角色名称', index: 'no' }, + { title: '角色描述', index: 'description' }, + { title: '创建人手机号', index: 'description' }, + { + title: '创建时间', + index: 'updatedAt', + type: 'date' + }, + { + title: '操作', + buttons: [ + { + text: '编辑' + // click: item => this.staffAction(item) + }, + { + text: '删除' + // click: item => this.action(3) + } + ] + } + ]; + + selectedRows: any[] = []; + + reqParams = { pageIndex: 1, pageSize: 10 }; + + constructor(public service: SystemService, private nzModalService: NzModalService) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st.load(); + break; + } + } + + roleAction(item?: any) {} + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } +} diff --git a/src/app/routes/sys-setting/components/system-logs/system-logs.component.html b/src/app/routes/sys-setting/components/system-logs/system-logs.component.html new file mode 100644 index 00000000..6cd3aed6 --- /dev/null +++ b/src/app/routes/sys-setting/components/system-logs/system-logs.component.html @@ -0,0 +1,27 @@ + + + + +
+
+ +
+
+ + + +
+
+
+ + + + \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/system-logs/system-logs.component.less b/src/app/routes/sys-setting/components/system-logs/system-logs.component.less new file mode 100644 index 00000000..80d9010f --- /dev/null +++ b/src/app/routes/sys-setting/components/system-logs/system-logs.component.less @@ -0,0 +1,21 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 14px; + } + } + + nz-range-picker { + width: 100%; + } +} + +.expend-options { + margin-top: -40px; +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/system-logs/system-logs.component.ts b/src/app/routes/sys-setting/components/system-logs/system-logs.component.ts new file mode 100644 index 00000000..6839951f --- /dev/null +++ b/src/app/routes/sys-setting/components/system-logs/system-logs.component.ts @@ -0,0 +1,109 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../services/system.service'; + +@Component({ + selector: 'app-system-logs', + templateUrl: './system-logs.component.html', + styleUrls: ['./system-logs.component.less'] +}) +export class SystemLogsComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + url = `/rule?_allow_anonymous=true`; + + searchSchema: SFSchema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + receiveName: { + type: 'string', + title: '操作人', + ui: { placeholder: '请输入' } + }, + phone: { + type: 'string', + title: '手机号码', + ui: { placeholder: '请输入' } + }, + page: { + type: 'string', + title: '操作页面', + ui: { + placeholder: '请输入' + } + }, + content: { + type: 'string', + title: '操作内容', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + createTime: { + title: '操作时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + } + }; + + columns: STColumn[] = [ + { title: '操作时间', index: 'updatedAt', type: 'date' }, + { title: '操作人', index: 'description' }, + { title: '操作人手机号码', index: 'description' }, + { title: '操作页面', index: 'description' }, + { title: '操作内容', index: 'description' }, + { + title: '创建时间', + index: 'updatedAt', + type: 'date' + } + ]; + + selectedRows: any[] = []; + + reqParams = { pageIndex: 1, pageSize: 10 }; + _$expand = false; + + constructor(public service: SystemService, private nzModalService: NzModalService) {} + + ngOnInit(): void {} + + stChange(e: STChange): void {} + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } +} diff --git a/src/app/routes/sys-setting/components/user-logs/user-logs.component.html b/src/app/routes/sys-setting/components/user-logs/user-logs.component.html new file mode 100644 index 00000000..fb7cfab8 --- /dev/null +++ b/src/app/routes/sys-setting/components/user-logs/user-logs.component.html @@ -0,0 +1,27 @@ + + + + +
+
+ +
+
+ + + +
+
+
+ + + + \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/user-logs/user-logs.component.less b/src/app/routes/sys-setting/components/user-logs/user-logs.component.less new file mode 100644 index 00000000..80d9010f --- /dev/null +++ b/src/app/routes/sys-setting/components/user-logs/user-logs.component.less @@ -0,0 +1,21 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 14px; + } + } + + nz-range-picker { + width: 100%; + } +} + +.expend-options { + margin-top: -40px; +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/user-logs/user-logs.component.ts b/src/app/routes/sys-setting/components/user-logs/user-logs.component.ts new file mode 100644 index 00000000..d7707c88 --- /dev/null +++ b/src/app/routes/sys-setting/components/user-logs/user-logs.component.ts @@ -0,0 +1,115 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../services/system.service'; + +@Component({ + selector: 'app-user-logs', + templateUrl: './user-logs.component.html', + styleUrls: ['./user-logs.component.less'] +}) +export class UserLogsComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + url = `/rule?_allow_anonymous=true`; + + searchSchema: SFSchema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + receiveName: { + type: 'string', + title: '登录端口', + ui: { placeholder: '请输入' } + }, + phone: { + type: 'string', + title: '登录方式', + ui: { placeholder: '请输入' } + }, + page: { + type: 'string', + title: '位置', + ui: { + placeholder: '请输入' + } + }, + content: { + type: 'string', + title: 'ip', + ui: { + placeholder: '请输入', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + createTime: { + title: '登录时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + } + }; + + columns: STColumn[] = [ + { title: '登录时间', index: 'updatedAt', type: 'date' }, + { title: '登录端口', index: 'description' }, + { title: '姓名', index: 'description' }, + { title: '登录方式', index: 'description' }, + { title: '位置', index: 'description' }, + { title: 'ip', index: 'description' } + ]; + selectedRows: any[] = []; + + reqParams = { pageIndex: 1, pageSize: 10 }; + _$expand = false; + + constructor(public service: SystemService, private nzModalService: NzModalService) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st.load(); + break; + } + } + + roleAction(item?: any) {} + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } +} diff --git a/src/app/routes/sys-setting/components/version-logs/version-logs.component.html b/src/app/routes/sys-setting/components/version-logs/version-logs.component.html new file mode 100644 index 00000000..6f566f41 --- /dev/null +++ b/src/app/routes/sys-setting/components/version-logs/version-logs.component.html @@ -0,0 +1,27 @@ + + + + +
+
+ +
+
+ + + +
+
+
+ + + + \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/version-logs/version-logs.component.less b/src/app/routes/sys-setting/components/version-logs/version-logs.component.less new file mode 100644 index 00000000..80d9010f --- /dev/null +++ b/src/app/routes/sys-setting/components/version-logs/version-logs.component.less @@ -0,0 +1,21 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 14px; + } + } + + nz-range-picker { + width: 100%; + } +} + +.expend-options { + margin-top: -40px; +} \ No newline at end of file diff --git a/src/app/routes/sys-setting/components/version-logs/version-logs.component.ts b/src/app/routes/sys-setting/components/version-logs/version-logs.component.ts new file mode 100644 index 00000000..1d68a7ab --- /dev/null +++ b/src/app/routes/sys-setting/components/version-logs/version-logs.component.ts @@ -0,0 +1,109 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SystemService } from '../../services/system.service'; + +@Component({ + selector: 'app-version-logs', + templateUrl: './version-logs.component.html', + styleUrls: ['./version-logs.component.less'] +}) +export class VersionLogsComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + url = `/rule?_allow_anonymous=true`; + + searchSchema: SFSchema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + receiveName: { + type: 'string', + title: '端口', + ui: { placeholder: '请输入' } + }, + phone: { + type: 'string', + title: '端口方式', + ui: { placeholder: '请输入' } + }, + page: { + type: 'string', + title: '版本号', + ui: { + placeholder: '请输入' + } + }, + createTime: { + title: '发布时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + } + }; + + columns: STColumn[] = [ + { title: '端口', index: 'no' }, + { title: '端口方式', index: 'description' }, + { title: '版本号', index: 'description' }, + { + title: '发布时间', + index: 'updatedAt', + type: 'date' + }, + { title: '更新内容', index: 'description' } + ]; + + selectedRows: any[] = []; + + reqParams = { pageIndex: 1, pageSize: 10 }; + _$expand = false; + + constructor(public service: SystemService, private nzModalService: NzModalService) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st.load(); + break; + } + } + + roleAction(item?: any) {} + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } +} diff --git a/src/app/routes/sys-setting/sys-setting-routing.module.ts b/src/app/routes/sys-setting/sys-setting-routing.module.ts index 7e35a056..fda7ba9b 100644 --- a/src/app/routes/sys-setting/sys-setting-routing.module.ts +++ b/src/app/routes/sys-setting/sys-setting-routing.module.ts @@ -1,8 +1,24 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; +import { AuditReasonConfigComponent } from './components/audit-reason-config/audit-reason-config.component'; +import { BasicConfigComponent } from './components/basic-config/basic-config.component'; +import { CartConfigComponent } from './components/cart-config/cart-config.component'; +import { RoleManagementComponent } from './components/role-management/role-management.component'; import { StaffManagementComponent } from './components/staff-management/staff-management.component'; +import { SystemLogsComponent } from './components/system-logs/system-logs.component'; +import { UserLogsComponent } from './components/user-logs/user-logs.component'; +import { VersionLogsComponent } from './components/version-logs/version-logs.component'; -const routes: Routes = [{ path: 'staff-management', component: StaffManagementComponent }]; +const routes: Routes = [ + { path: 'staff-management', component: StaffManagementComponent }, + { path: 'role-management', component: RoleManagementComponent }, + { path: 'basic-config', component: BasicConfigComponent }, + { path: 'system-logs', component: SystemLogsComponent }, + { path: 'user-logs', component: UserLogsComponent }, + { path: 'version-logs', component: VersionLogsComponent }, + { path: 'audit-reason-config', component: AuditReasonConfigComponent }, + { path: 'cart-config', component: CartConfigComponent }, +]; @NgModule({ imports: [RouterModule.forChild(routes)], diff --git a/src/app/routes/sys-setting/sys-setting.module.ts b/src/app/routes/sys-setting/sys-setting.module.ts index b71876d6..41134a02 100644 --- a/src/app/routes/sys-setting/sys-setting.module.ts +++ b/src/app/routes/sys-setting/sys-setting.module.ts @@ -5,10 +5,36 @@ import { StaffManagementComponent } from './components/staff-management/staff-ma import { SysSettingRoutingModule } from './sys-setting-routing.module'; import { BuyerTranspowerComponent } from './components/staff-management/transpower/transpower.component'; import { SystemStaffStaffModalComponent } from './components/staff-management/staff-modal/staff-modal.component'; +import { RoleManagementComponent } from './components/role-management/role-management.component'; +import { SystemLogsComponent } from './components/system-logs/system-logs.component'; +import { UserLogsComponent } from './components/user-logs/user-logs.component'; +import { VersionLogsComponent } from './components/version-logs/version-logs.component'; +import { BasicConfigComponent } from './components/basic-config/basic-config.component'; +import { AuditReasonConfigComponent } from './components/audit-reason-config/audit-reason-config.component'; +import { BasicConfigActionModalComponent } from './components/basic-config/basic-config-action-modal/basic-config-action-modal.component'; +import { AuditResonConfigActionModalComponent } from './components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component'; +import { CartConfigComponent } from './components/cart-config/cart-config.component'; +import { CartConfigActionModalComponent } from './components/cart-config/cart-config-action-modal/cart-config-action-modal.component'; -const COMPONENTS = [StaffManagementComponent, BuyerTranspowerComponent, SystemStaffStaffModalComponent]; +const COMPONENTS = [ + StaffManagementComponent, + RoleManagementComponent, + BasicConfigComponent, + SystemLogsComponent, + UserLogsComponent, + VersionLogsComponent, + AuditReasonConfigComponent, + CartConfigComponent +]; +const NOTROUTECOMPONENTS = [ + BuyerTranspowerComponent, + SystemStaffStaffModalComponent, + BasicConfigActionModalComponent, + AuditResonConfigActionModalComponent, + CartConfigActionModalComponent +]; @NgModule({ - declarations: COMPONENTS, + declarations: [...COMPONENTS, ...NOTROUTECOMPONENTS], imports: [CommonModule, SysSettingRoutingModule, SharedModule] }) export class SysSettingModule {} diff --git a/src/assets/mocks/menu-data.json b/src/assets/mocks/menu-data.json index ccce72da..3d2361b8 100644 --- a/src/assets/mocks/menu-data.json +++ b/src/assets/mocks/menu-data.json @@ -85,43 +85,47 @@ }, { "text": "角色管理", - "link": "/demo/alain" + "link": "/system/role-management" }, { "text": "基础设置", - "link": "/demo/alain" + "link": "/system/basic-config" }, { "text": "车型车长配置", - "link": "/demo/alain" + "link": "/system/cart-config" }, { "text": "基础配置", - "link": "/demo/alain" + "link": "/system/basic-config" }, { "text": "系统日志", - "link": "/demo/alain" + "link": "/system/system-logs" }, { "text": "用户登录日志", - "link": "/demo/alain" + "link": "/system/user-logs" }, { "text": "版本发布记录", - "link": "/demo/alain" + "link": "/system/version-logs" }, { "text": "协议配置", - "link": "/demo/alain" + "link": "/system/alain" }, { "text": "审核驳回理由配置", - "link": "/demo/alain" + "link": "/system/audit-reason-config" }, { "text": "系统配置", "link": "/demo/alain" + }, + { + "text": "货物名称配置", + "link": "/demo/alain" } ] } From 4d0627ff359069db36e4c5fdd2839c19972debeb Mon Sep 17 00:00:00 2001 From: wangshiming Date: Tue, 30 Nov 2021 20:38:56 +0800 Subject: [PATCH 0014/1600] =?UTF-8?q?=E8=BD=A6=E9=98=9F=E9=95=BF=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../driver/captain/captain.component.html | 83 + .../driver/captain/captain.component.spec.ts | 31 + .../driver/captain/captain.component.ts | 247 +++ .../driver/detail/detail.component.html | 271 ++-- .../driver/detail/detail.component.spec.ts | 12 +- .../driver/detail/detail.component.ts | 117 +- .../components/driver/driver.component.html | 3 +- .../components/driver/driver.component.ts | 69 +- .../components/driver/new/new.component.html | 109 -- .../components/driver/new/new.component.less | 109 -- .../components/driver/new/new.component.ts | 1400 ----------------- .../driver/view/view.component.html | 49 - .../driver/view/view.component.less | 46 - .../driver/view/view.component.spec.ts | 23 - .../components/driver/view/view.component.ts | 257 --- .../usercenter/usercenter-routing.module.ts | 6 +- .../routes/usercenter/usercenter.module.ts | 8 +- src/assets/mocks/menu-data.json | 11 + 18 files changed, 623 insertions(+), 2228 deletions(-) create mode 100644 src/app/routes/usercenter/components/driver/captain/captain.component.html create mode 100644 src/app/routes/usercenter/components/driver/captain/captain.component.spec.ts create mode 100644 src/app/routes/usercenter/components/driver/captain/captain.component.ts delete mode 100644 src/app/routes/usercenter/components/driver/new/new.component.html delete mode 100644 src/app/routes/usercenter/components/driver/new/new.component.less delete mode 100644 src/app/routes/usercenter/components/driver/new/new.component.ts delete mode 100644 src/app/routes/usercenter/components/driver/view/view.component.html delete mode 100644 src/app/routes/usercenter/components/driver/view/view.component.less delete mode 100644 src/app/routes/usercenter/components/driver/view/view.component.spec.ts delete mode 100644 src/app/routes/usercenter/components/driver/view/view.component.ts diff --git a/src/app/routes/usercenter/components/driver/captain/captain.component.html b/src/app/routes/usercenter/components/driver/captain/captain.component.html new file mode 100644 index 00000000..76715051 --- /dev/null +++ b/src/app/routes/usercenter/components/driver/captain/captain.component.html @@ -0,0 +1,83 @@ + + + + + + +
+ +
+ + +
+ + + + +
+ +
+
+ + + + +
+
+
+
+ + + + + + +
+
+ {{ item.enterpriseName }} +
+
+
+ +
+ {{ item.contactsPhone }} +
+
+ + 冻结 + 正常 + +
+
diff --git a/src/app/routes/usercenter/components/driver/captain/captain.component.spec.ts b/src/app/routes/usercenter/components/driver/captain/captain.component.spec.ts new file mode 100644 index 00000000..8ca6e88c --- /dev/null +++ b/src/app/routes/usercenter/components/driver/captain/captain.component.spec.ts @@ -0,0 +1,31 @@ +/* + * @Author: your name + * @Date: 2021-11-30 16:56:15 + * @LastEditTime: 2021-11-30 20:36:30 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\usercenter\components\driver\driver.component.spec.ts + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { UserCenterComponentsDriverCaptainComponent } from './captain.component'; + +describe('UserCenterComponentsDriverCaptainComponent', () => { + let component: UserCenterComponentsDriverCaptainComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [UserCenterComponentsDriverCaptainComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UserCenterComponentsDriverCaptainComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/usercenter/components/driver/captain/captain.component.ts b/src/app/routes/usercenter/components/driver/captain/captain.component.ts new file mode 100644 index 00000000..b1fc9c7a --- /dev/null +++ b/src/app/routes/usercenter/components/driver/captain/captain.component.ts @@ -0,0 +1,247 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { STColumn, STColumnBadge, STComponent, STData } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { UsermanageService } from '../../../services/usercenter.service'; +@Component({ + selector: 'app-usercenter-components-driver-captain', + templateUrl: './captain.component.html', +}) +export class UserCenterComponentsDriverCaptainComponent implements OnInit { + _$expand = false; + url = `/rule?_allow_anonymous=true`; + + ui!: SFUISchema; + schema!: SFSchema; + columns!: STColumn[]; + datalist = [ + { + storeName: '企业名称', + contactsName: '152746565', + enterpriseName: '湖南', + unifiedSocialCreditCode: '45454', + contactsPhone: '*97889461561', + effectiveDateStr: '废弃eww', + enStatusStr2: '正常', + enStatusStr3: '正常', + unifiedSocialCreditCode3: '常用服务', + unifiedSocialCreditCode2: '正常', + tenantId: 1 + }, + { + storeName: '企业名称', + contactsName: '152746565', + enterpriseName: '湖南', + unifiedSocialCreditCode: '45454', + contactsPhone: '*97889461561', + effectiveDateStr: '废弃eww', + enStatusStr2: '正常', + enStatusStr3: '正常', + unifiedSocialCreditCode3: '常用服务', + unifiedSocialCreditCode2: '正常', + tenantId: 2 + }, + ] + @ViewChild('st', { static: false }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + + constructor(public service: UsermanageService, private modal: NzModalService, private router: Router, private ar: ActivatedRoute) {} + /** + * 查询字段个数navigate + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + + /** + * 查询参数 + */ + get reqParams() { + const params: any = { + ...(this.sf && this.sf.value), + }; + if (this.sf?.value.effectiveDate) { + params.effectiveDateStart = this.sf?.value.effectiveDate[0]; + params.effectiveDateEnd = this.sf?.value.effectiveDate[1]; + } + delete params.effectiveDate; + delete params.expand; + return params; + } + + get selectedRows() { + return this.st?.list.filter((item) => item.checked) || []; + } + + ngOnInit() { + this.initSF(); + this.initST(); + this.ar.url.subscribe((params) => { + this.st?.load(1); + }); + } + dataProcess(data: STData[]): STData[] { + return data.map((i, index) => { + i.showSortFlag = false; + return i; + }); + } + initSF() { + this.schema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true, + }, + }, + storeName: { title: '司机姓名', type: 'string', ui: { showRequired: false } }, + phone: { + title: '手机号', + type: 'string', + format: 'mobile', + maxLength: 11, + ui: { + placeholder: '请输入手机号', + }, + }, + enStatus: { + type: 'string', + title: '实名状态', + enum: [ + { label: '全部', value: '' }, + { label: '正常', value: 0 }, + { label: '冻结', value: 1 }, + { label: '废弃', value: 2 }, + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value, + }, + }, + }, + enStatus2: { + type: 'string', + title: '驾驶证状态', + enum: [ + { label: '全部', value: '' }, + { label: '正常', value: 0 }, + { label: '冻结', value: 1 }, + { label: '废弃', value: 2 }, + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value, + }, + }, + }, + enStatus23: { + type: 'string', + title: '从业资格证状态', + enum: [ + { label: '全部', value: '' }, + { label: '正常', value: 0 }, + { label: '冻结', value: 1 }, + { label: '废弃', value: 2 }, + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value, + }, + }, + }, + phone2: { + title: '业务员手机号', + type: 'string', + format: 'mobile', + maxLength: 11, + ui: { + placeholder: '请输入手机号', + }, + }, + + }, + }; + this.ui = { '*': { spanLabelFixed: 180, grid: { span: 8, gutter: 4 }, enter: () => this.st.load() } }; + } + + initST() { + this.columns = [ + // { title: '', type: 'checkbox', className: 'text-center' }, + { title: '司机姓名', className: 'text-center', index: 'storeName' }, + { title: '手机号', className: 'text-center', index: 'contactsName' }, + { title: '承运总单量', className: 'text-center', render: 'enterpriseName' }, + { title: '当前车辆', className: 'text-center', index: 'unifiedSocialCreditCode' }, + { title: '实名认证状态', className: 'text-center', index: 'effectiveDateStr', + type: 'badge', + badge: { + 正常: { text: '正常', color: 'success' }, + 冻结: { text: '冻结', color: 'warning' }, + 废弃: { text: '废弃', color: 'default' }, + }, + }, + { + title: '驾驶证状态', + className: 'text-center', + index: 'enStatusStr2', + type: 'badge', + badge: { + 正常: { text: '正常', color: 'success' }, + 冻结: { text: '冻结', color: 'warning' }, + 废弃: { text: '废弃', color: 'default' }, + }, + }, + { + title: '从业资格证状态', + className: 'text-center', + index: 'enStatusStr3', + type: 'badge', + badge: { + 正常: { text: '正常', color: 'success' }, + 冻结: { text: '冻结', color: 'warning' }, + 废弃: { text: '废弃', color: 'default' }, + }, + }, + { title: '推广业务员', className: 'text-center', index: 'unifiedSocialCreditCode2' }, + { title: '注册时间', className: 'text-center', index: 'unifiedSocialCreditCode3' }, + { + title: '操作', + width: '170px', + className: 'text-center', + buttons: [ + { + text: '查看', + click: (item) => { + this.router.navigate(['./detail', item.tenantId], { relativeTo: this.ar }); + // this.router.navigate(['./view', item.id], { relativeTo: this.ar, queryParams: { tenantId: item.tenantId } }); + }, + }, + ], + }, + ]; + } + daoyun(item: any) { + this.router.navigate(['./view', item.tenantId], { relativeTo: this.ar }); + } + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } + creat() { + this.router.navigate(['./new',], { relativeTo: this.ar }); + } + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } +} diff --git a/src/app/routes/usercenter/components/driver/detail/detail.component.html b/src/app/routes/usercenter/components/driver/detail/detail.component.html index 4aafe892..89cc77e7 100644 --- a/src/app/routes/usercenter/components/driver/detail/detail.component.html +++ b/src/app/routes/usercenter/components/driver/detail/detail.component.html @@ -1,6 +1,6 @@ - + - - @@ -124,166 +102,173 @@ - -
- - - -
确定关闭该企业支付权限吗?
-
- 停用后,该企业将被限制使用支付功能,请谨慎操作 -
-
-
- -
- - - -
确定开通该企业支付权限吗?
-
- 启用后,该企业将恢复正常支付功能,请再次确认 -
-
-
- - 联系信息人 - + + 实名认证信息 + {{ detailData?.contactsName }} - - {{ detailData?.contactsPhone }} - - + {{ detailData?.contactsPhone }} + + +
+
+ + +
+
+ - 公司基本信息 - + 驾驶证信息 + {{ detailData?.enterpriseName }} - + {{ detailData?.unifiedSocialCreditCode }} - + {{ detailData?.enterpriseType }} - - {{ detailData?.registrationCapital }} - 万元 - - - {{ detailData?.enterpriseRegistrationTime }} - - -
- {{ detailData?.operatingStartTime }} 至 {{ detailData?.operatingEndTime }} -
-
长期
-
{{ detailData?.operatingStartTime }} 至 长期
-
+ - - {{ detailData?.enterpriseAddressCodeStr }} - - - {{ detailData?.enterpriseAddress }} - - - - - {{ detailData?.enterpriseAddressCodeStr }} - - - {{ detailData?.enterpriseAddress }} - - - - - {{ detailData?.enterpriseAddressCodeStr }} - - - {{ detailData?.enterpriseAddress }} - - - - + + {{ detailData?.registrationCapital }} + 万元 + + + {{ detailData?.enterpriseRegistrationTime }} + + + + + + + + 从业资格证信息 + {{ detailData?.businessScope }} - - + + {{ detailData?.businessScope }} + + + {{ detailData?.businessScope }} + + + + +
+
+ + + +
+
+
+
+ - 法人信息 - + 载具信息 + {{ detailData?.name }} - + {{ detailData?.certificateNumber }} - - {{ detailData?.validStartTime }} - - {{ detailData?.validEndTime ? detailData?.validEndTime : '长期' }} + + {{ detailData?.validStartTime }} - + + {{ detailData?.validStartTime }} + + + {{ detailData?.validStartTime }} + + + {{ detailData?.validStartTime }} + + + + + + + + 银行结算信息 - + {{ detailData?.name }} - + {{ detailData?.certificateNumber }} - - {{ detailData?.validStartTime }} - + + + 服务评级 + + + + + + + + + + + + + + + + + + + + +
+ +
+
- - -
+ + + + + + - -
+ + +
+ + + + + + + + + diff --git a/src/app/routes/usercenter/components/driver/detail/detail.component.spec.ts b/src/app/routes/usercenter/components/driver/detail/detail.component.spec.ts index 00666a0b..c2215295 100644 --- a/src/app/routes/usercenter/components/driver/detail/detail.component.spec.ts +++ b/src/app/routes/usercenter/components/driver/detail/detail.component.spec.ts @@ -7,20 +7,20 @@ * @FilePath: \tms-obc-web\src\app\routes\usercenter\components\freight\list\detail\detail.component.spec.ts */ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FreightComponentsListDetailComponent } from './detail.component'; +import { UserCenterComponentsDriverDetailComponent } from './detail.component'; -describe('FreightComponentsListDetailComponent', () => { - let component: FreightComponentsListDetailComponent; - let fixture: ComponentFixture; +describe('UserCenterComponentsDriverDetailComponent', () => { + let component: UserCenterComponentsDriverDetailComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [FreightComponentsListDetailComponent], + declarations: [UserCenterComponentsDriverDetailComponent], }).compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(FreightComponentsListDetailComponent); + fixture = TestBed.createComponent(UserCenterComponentsDriverDetailComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/src/app/routes/usercenter/components/driver/detail/detail.component.ts b/src/app/routes/usercenter/components/driver/detail/detail.component.ts index 809f567f..400db1e1 100644 --- a/src/app/routes/usercenter/components/driver/detail/detail.component.ts +++ b/src/app/routes/usercenter/components/driver/detail/detail.component.ts @@ -1,30 +1,33 @@ import { Component, OnInit, ViewChild } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { STColumn, STComponent } from '@delon/abc/st'; -import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFTagWidgetSchema, SFTextWidgetSchema, SFUISchema } from '@delon/form'; import { ModalHelper, _HttpClient } from '@delon/theme'; import { NzMessageService } from 'ng-zorro-antd/message'; -import { UsermanageService } from '../../../../services/usercenter.service'; +import { UsermanageService } from '../../../services/usercenter.service'; @Component({ - selector: 'app-supplier-components-list-view', + selector: 'app-usercenter-components-driver-detail', templateUrl: './detail.component.html', styleUrls: ['./detail.component.less'], }) -export class FreightComponentsListDetailComponent implements OnInit { +export class UserCenterComponentsDriverDetailComponent implements OnInit { i: any; url = `/rule?_allow_anonymous=true`; @ViewChild('st', { static: false }) st!: STComponent; detailData: any; isShow = false; isVisible = false; + isVisibleNo = false; modalTitle = '有效期'; modalName = ''; ui!: SFUISchema; schema!: SFSchema; + ui2!: SFUISchema; + schema2!: SFSchema; @ViewChild('sf', { static: false }) sf!: SFComponent; schema1!: SFSchema; - @ViewChild('sf1', { static: false }) sf1!: SFComponent; + @ViewChild('sf2', { static: false }) sf2!: SFComponent; validData: any = ['suppliersType']; suppliersData: any = {}; @@ -41,7 +44,7 @@ export class FreightComponentsListDetailComponent implements OnInit { console.log(this.route.snapshot); // this.initData(); this.initSF(); - this.initSF1(); + this.initSFNo(); // this.launchSign(); } /** @@ -65,44 +68,36 @@ export class FreightComponentsListDetailComponent implements OnInit { }; this.ui = { '*': { spanLabelFixed: 120, grid: { span: 24 } } }; } - initSF1() { - this.schema1 = { + initSFNo() { + this.schema2 = { properties: { - _$expand: { type: 'boolean', ui: { hidden: true } }, - suppliersType: { + '姓名': { type: 'number', ui: { widget: 'text', defaultText: '深圳市星链供应链云科技有限公' } as SFTextWidgetSchema }, + roleDescription: { + title: '备注', type: 'string', - title: '类型', - enum: [ - { label: '非外部供应商', value: 0 }, - { label: '外部供应商', value: 1 }, - ], - default: '', + maxLength: 30, ui: { - widget: 'select', - change: (args: any) => { - console.log(args, 'args'); - this.suppliersData.suppliersType = args; - if (args === 1) { - this.validData = ['suppliersType', 'externalSuppliersId']; - } else { - this.validData = ['suppliersType']; - this.suppliersData.externalSuppliersId = ''; - } - this.initSF1(); - }, + placeholder: '请输入地址', + widget: 'textarea', }, }, - externalSuppliersId: { - title: '外部供应商id', - type: 'string', - default: '', + like: { + type: 'number', + title: '可选理由', + enum: [ + { value: 1, label: '电影' }, + { value: 2, label: '书' }, + { value: 3, label: '旅行' }, + ], ui: { - visibleIf: { suppliersType: (value: any) => value === 1 }, - }, + widget: 'tag', + } as SFTagWidgetSchema, + default: [1, 2], }, }, - required: this.validData, + required: ['roleDescription'], }; + this.ui2 = { '*': { spanLabelFixed: 120, grid: { span: 24 } } }; } showModal(name: any) { this.modalName = name; @@ -221,35 +216,45 @@ export class FreightComponentsListDetailComponent implements OnInit { } handleCancel(name: any) { - if (name === 'effectiveDate') { - this.isShow = false; + if (name === 'suppliersTypeNo') { + this.isVisibleNo = false; } else { this.isVisible = false; } } - handleOK(name: any) { + handleOK() { const params: any = { tenantId: this.route.snapshot.params.id, // tenantId: this.route.snapshot.queryParams.tenantId, }; - if (name === 'effectiveDate') { - params.effectiveDate = this.sf?.value?.effectiveDate; - } else { - Object.assign(params, this.sf1?.value); - } - this.service.http.post(this.service.$api_set_freezeOrResume, params).subscribe((res) => { - if (res.data === true) { - this.service.msgSrv.success(`编辑成功!`); - this.ngOnInit(); - } else { - this.service.msgSrv.error(res.msg || '编辑失败!'); - } - if (name === 'effectiveDate') { - this.isShow = false; - } else { - this.isVisible = false; - } - }); + // if (name === 'effectiveDate') { + // params.effectiveDate = this.sf?.value?.effectiveDate; + // } else { + // Object.assign(params, this.sf1?.value); + // } + // this.service.http.post(this.service.$api_set_freezeOrResume, params).subscribe((res) => { + // if (res.data === true) { + // this.service.msgSrv.success(`编辑成功!`); + // this.ngOnInit(); + // } else { + // this.service.msgSrv.error(res.msg || '编辑失败!'); + // } + // if (name === 'effectiveDate') { + // this.isShow = false; + // } else { + // this.isVisible = false; + // } + // }); } + auditPass() { + this.isVisible = true + } + auditNo() { + this.isVisibleNo = true + } + ratify() { + + } + } diff --git a/src/app/routes/usercenter/components/driver/driver.component.html b/src/app/routes/usercenter/components/driver/driver.component.html index fcb84ee1..76715051 100644 --- a/src/app/routes/usercenter/components/driver/driver.component.html +++ b/src/app/routes/usercenter/components/driver/driver.component.html @@ -1,7 +1,7 @@ - - - - - - - - - - - -

道路运输经营许可证

- -
- - -
-
-
- - diff --git a/src/app/routes/usercenter/components/driver/view/view.component.less b/src/app/routes/usercenter/components/driver/view/view.component.less deleted file mode 100644 index 48f605d9..00000000 --- a/src/app/routes/usercenter/components/driver/view/view.component.less +++ /dev/null @@ -1,46 +0,0 @@ -@import '~@delon/theme/index'; -:host { - ::ng-deep { - .ant-steps-dot { - .ant-steps-item-content { - width: 200px; - } - .ant-steps-item-icon { - margin-left: 96px; - } - .ant-steps-item-tail::after { - margin-left: 40px; - } - } - .success { - color: @success-color; - } - - .warning { - color: @warning-color; - } - - .error { - color: @error-color; - } - } - .mt16 { - margin-top: 16px; - } - .user-info { - display: flex; - font-size: 16px; - .enterprise-name { - margin-right: 15px; - } - img { - width: 64px; - height: 64px; - margin-right: 15px; - border-radius: 50%; - } - .user-info-des { - margin-bottom: 5px; - } - } -} diff --git a/src/app/routes/usercenter/components/driver/view/view.component.spec.ts b/src/app/routes/usercenter/components/driver/view/view.component.spec.ts deleted file mode 100644 index 6e2a7782..00000000 --- a/src/app/routes/usercenter/components/driver/view/view.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FreightComponentsListViewComponent } from './view.component'; - -describe('FreightComponentsListViewComponent', () => { - let component: FreightComponentsListViewComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [FreightComponentsListViewComponent], - }).compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(FreightComponentsListViewComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/routes/usercenter/components/driver/view/view.component.ts b/src/app/routes/usercenter/components/driver/view/view.component.ts deleted file mode 100644 index f72bb40a..00000000 --- a/src/app/routes/usercenter/components/driver/view/view.component.ts +++ /dev/null @@ -1,257 +0,0 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { STColumn, STComponent } from '@delon/abc/st'; -import { ModalHelper, _HttpClient } from '@delon/theme'; -import { NzMessageService } from 'ng-zorro-antd/message'; -import { UsermanageService } from '../../../../services/usercenter.service'; -import { SFComponent, SFSchema, SFDateWidgetSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form'; -import { Observable, Observer } from 'rxjs'; -@Component({ - selector: 'app-Freight-components-list-view', - templateUrl: './view.component.html', - styleUrls: ['./view.component.less'], -}) -export class FreightComponentsListViewComponent implements OnInit { - i: any; - url = `/rule?_allow_anonymous=true`; - - @ViewChild('st', { static: false }) st!: STComponent; - detailData: any = { - status: 0 - }; - isShow = false; - isVisible = false; - modalTitle = '有效期'; - modalName = ''; - ui!: SFUISchema; - schema!: SFSchema; - @ViewChild('sf', { static: false }) sf!: SFComponent; - @ViewChild('sf1', { static: false }) sf1!: SFComponent; - validData: any = ['FreightsType']; - FreightsData: any = {}; - - constructor( - private http: _HttpClient, - private modal: ModalHelper, - public service: UsermanageService, - private route: ActivatedRoute, - private modalHelper: ModalHelper, - private msgSrv: NzMessageService, - ) {} - - ngOnInit() { - console.log(this.route.snapshot); - this.initData(); - this.initSF(); - // this.launchSign(); - } - /** - * 初始化查询表单 - */ - initSF() { - this.schema = { - properties: { - name: { - title: '许可证号', - type: 'string', - maxLength: 20, - ui: { - placeholder: '请输入角色名称', - }, - }, - phone: { - title: '业户名称', - type: 'string', - maxLength: 20, - ui: { - placeholder: '请输入业户名称', - }, - }, - roleDescription: { - title: '地址', - type: 'string', - maxLength: 30, - ui: { - placeholder: '请输入地址', - widget: 'textarea', - }, - }, - effectiveDate: { - title: '发证日期', - type: 'string', - ui: { - widget: 'date', - format: 'yyyy-MM-dd 00:00:00', - // hidden: this.modalName === 'effectiveDate' ? false : true, - } as SFDateWidgetSchema, - }, - phone3: { - title: '有效期', - type: 'string', - ui: { - placeholder: '请输入业户名称', - }, - }, - phone4: { - title: '有效期截止', - type: 'string', - ui: { - placeholder: '请输入业户名称', - }, - }, - phone5: { - title: '经营范围', - type: 'string', - ui: { - placeholder: '请输入业户名称', - }, - }, - avatar: { - type: 'string', - title: '证照', - ui: { - // action: environment.UPLOAD_URL, - fileType: 'image/png,image/jpeg,image/jpg,image/png,image/gif,image/bmp', - limit: 1, - limitFileCount: 1, - resReName: 'url', - urlReName: 'url', - widget: 'upload', - descriptionI18n: '图片支持jpg、jpeg、png、gif格式,大小不超过5M', - data: { - // appId: environment.appId, - }, - name: 'multipartFile', - multiple: false, - listType: 'picture-card', - change: (args) => { - if (args.type === 'success') { - const avatar = [ - { - uid: -1, - name: 'LOGO', - status: 'done', - url: args.fileList[0].response.url, - response: { - url: args.fileList[0].response.url, - }, - }, - ]; - this.sf?.setValue('/avatar', avatar); - } - }, - beforeUpload: (file: any, _fileList) => { - return new Observable((observer: Observer) => { - const isLt2M = file.size / 1024 / 1024 < 5; - if (!isLt2M) { - this.service.msgSrv.warning('图片大小超过5M!'); - observer.complete(); - return; - } - observer.next(isLt2M); - observer.complete(); - }); - }, - } as SFUploadWidgetSchema, - }, - }, - required: ['name', 'phone'], - }; - this.ui = { '*': { spanLabelFixed: 200, grid: {offset:4, span: 12 } } }; - } - showModal(name: any) { - this.modalName = name; - if (name === 'effectiveDate') { - this.isShow = true; - } else { - this.isVisible = true; - } - } - async initData() { - console.log(this.route.snapshot, 'this.route.snapshot'); - - const params = { - tenantId: this.route.snapshot.params.id, - }; - } - - /** - * 根据地区code查询地区详情 - * @param code 地区代码 - */ - async getRegionFullName(code: any) { - const params = { - regionCode: code, - }; - const res = await this.service.asyncRequest(this.service.$api_get_region_detailByCode, params, 'POST', true); - // if (res && res.regionFullName) { - // const arr = res.regionFullName.split(','); - // res.regionFullName = arr.reverse().join('-'); - // } - return res && res.regionFullName; - } - add() { - // this.modal - // .createStatic(FormEditComponent, { i: { id: 0 } }) - // .subscribe(() => this.st.reload()); - } - goBack() { - window.history.go(-1); - } - /** - * 冻结 - */ - freezeOrResume(type: number) { - this.service.http - .post(this.service.$api_set_freezeOrResume, { - tenantId: this.route.snapshot.params.id, - // tenantId: this.route.snapshot.queryParams.tenantId, - status: type, - }) - .subscribe((res) => { - if (res.data === true) { - if (type === 0) { - this.service.msgSrv.success(`启用成功!`); - } else if (type === 1) { - this.service.msgSrv.success(`冻结成功!`); - } - this.ngOnInit(); - } else { - this.service.msgSrv.error(res.msg || '操作失败!'); - } - }); - } - - handleCancel(name: any) { - if (name === 'effectiveDate') { - this.isShow = false; - } else { - this.isVisible = false; - } - } - handleOK(name: any) { - const params: any = { - tenantId: this.route.snapshot.params.id, - // tenantId: this.route.snapshot.queryParams.tenantId, - }; - - if (name === 'effectiveDate') { - params.effectiveDate = this.sf?.value?.effectiveDate; - } else { - Object.assign(params, this.sf1?.value); - } - this.service.http.post(this.service.$api_set_freezeOrResume, params).subscribe((res) => { - if (res.data === true) { - this.service.msgSrv.success(`编辑成功!`); - this.ngOnInit(); - } else { - this.service.msgSrv.error(res.msg || '编辑失败!'); - } - if (name === 'effectiveDate') { - this.isShow = false; - } else { - this.isVisible = false; - } - }); - } -} diff --git a/src/app/routes/usercenter/usercenter-routing.module.ts b/src/app/routes/usercenter/usercenter-routing.module.ts index 6fc28071..0b4a70fb 100644 --- a/src/app/routes/usercenter/usercenter-routing.module.ts +++ b/src/app/routes/usercenter/usercenter-routing.module.ts @@ -1,13 +1,15 @@ /* * @Author: your name * @Date: 2021-11-29 15:22:34 - * @LastEditTime: 2021-11-30 17:00:50 + * @LastEditTime: 2021-11-30 20:36:06 * @LastEditors: Please set LastEditors * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: \tms-obc-web\src\app\routes\usercenter\usercenter-routing.module.ts */ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; +import { UserCenterComponentsDriverCaptainComponent } from './components/driver/captain/captain.component'; +import { UserCenterComponentsDriverDetailComponent } from './components/driver/detail/detail.component'; import { UserCenterComponentsDriverComponent } from './components/driver/driver.component'; import { FreightComponentsEnterpriseAuditComponent } from './components/freight/enterprise-audit/enterprise-audit.component'; import { FreightComponentsEnterpriseAuditViewComponent } from './components/freight/enterprise-audit/view/view.component'; @@ -31,6 +33,8 @@ const routes: Routes = [ { path: 'freight/user', component: FreightComponentsUserComponent }, { path: 'freight/user/view/:id', component: FreightComponentsUserDetailComponent }, { path: 'driver', component: UserCenterComponentsDriverComponent }, + { path: 'driver/detail/:id', component: UserCenterComponentsDriverDetailComponent }, + { path: 'driver/captain', component: UserCenterComponentsDriverCaptainComponent }, ]; @NgModule({ diff --git a/src/app/routes/usercenter/usercenter.module.ts b/src/app/routes/usercenter/usercenter.module.ts index 197f6ff1..294a49c2 100644 --- a/src/app/routes/usercenter/usercenter.module.ts +++ b/src/app/routes/usercenter/usercenter.module.ts @@ -1,13 +1,15 @@ /* * @Author: your name * @Date: 2021-11-29 15:22:34 - * @LastEditTime: 2021-11-30 17:00:19 + * @LastEditTime: 2021-11-30 20:35:42 * @LastEditors: Please set LastEditors * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: \tms-obc-web\src\app\routes\usercenter\usercenter.module.ts */ import { NgModule } from '@angular/core'; import { SharedModule } from '@shared'; +import { UserCenterComponentsDriverCaptainComponent } from './components/driver/captain/captain.component'; +import { UserCenterComponentsDriverDetailComponent } from './components/driver/detail/detail.component'; import { UserCenterComponentsDriverComponent } from './components/driver/driver.component'; import { FreightComponentsEnterpriseAuditComponent } from './components/freight/enterprise-audit/enterprise-audit.component'; import { FreightComponentsEnterpriseAuditViewComponent } from './components/freight/enterprise-audit/view/view.component'; @@ -28,7 +30,9 @@ const COMPONENTS = [ FreightComponentsEnterpriseAuditViewComponent, FreightComponentsUserComponent, FreightComponentsUserDetailComponent, - UserCenterComponentsDriverComponent + UserCenterComponentsDriverComponent, + UserCenterComponentsDriverDetailComponent, + UserCenterComponentsDriverCaptainComponent ]; @NgModule({ diff --git a/src/assets/mocks/menu-data.json b/src/assets/mocks/menu-data.json index d7efcf70..e556252b 100644 --- a/src/assets/mocks/menu-data.json +++ b/src/assets/mocks/menu-data.json @@ -86,6 +86,17 @@ "text": "司机列表", "icon": "anticon anticon-dashboard", "link": "/usercenter/driver" + }, + { + "text": "司机详情", + "hide": true, + "icon": "anticon anticon-dashboard", + "link": "/usercenter/driver/detail/:id" + }, + { + "text": "车队长列表", + "icon": "anticon anticon-dashboard", + "link": "/usercenter/driver/captain" } ] }] From 741912c630877065d5b4a0cbbeeeffd5af27efef Mon Sep 17 00:00:00 2001 From: wangshiming Date: Wed, 1 Dec 2021 10:51:13 +0800 Subject: [PATCH 0015/1600] =?UTF-8?q?=E8=BD=A6=E9=98=9F=E9=95=BF=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/routes/routes-routing.module.ts | 5 +- .../components/carload/carload.component.html | 183 ++++++++ .../components/carload/carload.component.less | 128 ++++++ .../carload/carload.component.spec.ts | 31 ++ .../components/carload/carload.component.ts | 398 ++++++++++++++++++ .../components/list/list.component.html | 19 + .../components/list/list.component.spec.ts | 31 ++ .../components/list/list.component.ts | 22 + .../services/supply-goods.service.ts | 23 + .../supply-goods-routing.module.ts | 22 + .../supply-goods/supply-goods.module.ts | 24 ++ .../driver/captain/captain.component.html | 4 +- .../driver/captain/captain.component.ts | 89 +--- src/assets/mocks/menu-data.json | 11 + 14 files changed, 907 insertions(+), 83 deletions(-) create mode 100644 src/app/routes/supply-goods/components/carload/carload.component.html create mode 100644 src/app/routes/supply-goods/components/carload/carload.component.less create mode 100644 src/app/routes/supply-goods/components/carload/carload.component.spec.ts create mode 100644 src/app/routes/supply-goods/components/carload/carload.component.ts create mode 100644 src/app/routes/supply-goods/components/list/list.component.html create mode 100644 src/app/routes/supply-goods/components/list/list.component.spec.ts create mode 100644 src/app/routes/supply-goods/components/list/list.component.ts create mode 100644 src/app/routes/supply-goods/services/supply-goods.service.ts create mode 100644 src/app/routes/supply-goods/supply-goods-routing.module.ts create mode 100644 src/app/routes/supply-goods/supply-goods.module.ts diff --git a/src/app/routes/routes-routing.module.ts b/src/app/routes/routes-routing.module.ts index ee9104a3..2b964c24 100644 --- a/src/app/routes/routes-routing.module.ts +++ b/src/app/routes/routes-routing.module.ts @@ -1,7 +1,7 @@ /* * @Author: your name * @Date: 2021-11-29 10:20:33 - * @LastEditTime: 2021-11-29 15:38:35 + * @LastEditTime: 2021-12-01 09:53:56 * @LastEditors: Please set LastEditors * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: \tms-obc-web\src\app\routes\routes-routing.module.ts @@ -31,7 +31,8 @@ const routes: Routes = [ path: 'usercenter', loadChildren: () => import('./usercenter/usercenter.module').then(m => m.UsercenterModule) }, - { path: 'system', loadChildren: () => import('./sys-setting/sys-setting.module').then(m => m.SysSettingModule) } + { path: 'system', loadChildren: () => import('./sys-setting/sys-setting.module').then(m => m.SysSettingModule) }, + { path: 'supplygoods', loadChildren: () => import('./supply-goods/supply-goods.module').then(m => m.SupplyGoodsModule) } ] }, // passport diff --git a/src/app/routes/supply-goods/components/carload/carload.component.html b/src/app/routes/supply-goods/components/carload/carload.component.html new file mode 100644 index 00000000..7eeedbcc --- /dev/null +++ b/src/app/routes/supply-goods/components/carload/carload.component.html @@ -0,0 +1,183 @@ + + + + +
+ +
+ + +
+ + + + +
+ +
+
+ + + + +
+
+
+
+ +
+ + +
+ + + + 共 {{ total }} 条 + + + 商品 + 订单金额 + 收件人 + 下单商家 + 状态 + 操作 + + + + + +
+
+ 订单号:{{ data.orderSn }}        下单时间:{{ + data.createTime + }}         订单类型:{{ + data.supplierType == 1 ? '普通订单' : 'GD订单' + }} +         支付方式:{{ data.payType === 1 ? '一次性付款,先货后款' : '-' + }}{{ data.payType === 2 ? '分批付款,先货后款' : '' }}         配送方式:{{ + data.deliveryTypeDesc + }} +
+
+ + + +
+
+ +
+
+

+ {{ item.goodsName }}
+ + {{ items.specName }}:{{ items.specValueName }} + +
+

数量:{{ item.goodsQuantity }}

+

+
+
+ {{ item.sendType === 1 ? '已发货' : item.sendType === 2 ? '部分发货' : '' }}
+ {{ item.returnStatusName }} +
+
+ + + + + ¥{{ data.payAmount.toFixed(2) }} + + {{ data.receiveName }}
+ {{ data.receiveMobile }} + + + {{ data.tenantName }} + + + {{ data.orderStatusStr }}{{ + data.orderStatusDesc + }}
{{ + data.payStatusDesc + }}
+ + +
+ + + + + + + + + + + + + + + + + {{ item }} + + + + diff --git a/src/app/routes/supply-goods/components/carload/carload.component.less b/src/app/routes/supply-goods/components/carload/carload.component.less new file mode 100644 index 00000000..c98cff00 --- /dev/null +++ b/src/app/routes/supply-goods/components/carload/carload.component.less @@ -0,0 +1,128 @@ +.order-goods { + display: flex; + text-align: left; + .order-goods-img { + width: 80px; + height: 80px; + margin-right: 10px; + overflow: hidden; + img { + width: 100%; + } + } + .order-goods-info { + flex: 1; + } + .order-goods-state { + width: 70px; + margin-left: 10px; + line-height: 28px; + text-align: right; + } +} +h2 { + font-size: 16px; +} +p { + font-size: 14px; +} +.form, +.table { + background-color: #fff; +} +.form { + padding: 20px; +} +.select-item { + width: 180px; +} +.ant-form-item { + margin-bottom: 16px; +} +.order-line { + display: flex; + justify-content: space-between; +} + +.order-receiving { + .order-receiving-remark { + line-height: 26px; + span { + color: #1890ff; + } + input { + width: 130px; + margin-right: 6px; + padding: 0; + overflow: hidden; + color: #1890ff; + white-space: nowrap; + text-overflow: ellipsis; + background: none; + border: none; + &.have-edit { + color: #000000a6; + border: 1px solid #d9d9d9; + } + } + } +} +.order-operation { + div { + color: #1890ff; + cursor: pointer; + } + p { + margin-bottom: 10px; + } +} +.timeline { + span { + display: inline-block; + margin: 0 4px; + padding: 5px 6px; + color: #999; + background-color: #f2f2f2; + border-radius: 2px; + cursor: pointer; + } +} +.ant-table-tbody > tr.ant-table-row:hover > td { + background: #fff; +} + +.btnBox { + margin: 0 0 10px 0; +} +.searchAreaWrap { + display: flex; +} +.sfExpand { + display: block; +} +.actionBox { + margin: 0 0 0 10px; +} +.sfBox { + width: 60%; +} +.expandsfBox { + width: 100%; +} +.expandAcitonBox { + margin: 10px 0 20px 0; + text-align: right; +} +.actionAreaWrap { + margin: 0 0 20px 0; +} +.overflowText { + display: -webkit-box; + overflow: hidden; + text-align: left; + text-overflow: -o-ellipsis-lastline; + text-overflow: ellipsis; + -webkit-line-clamp: 2; + line-clamp: 2; + -webkit-box-orient: vertical; +} diff --git a/src/app/routes/supply-goods/components/carload/carload.component.spec.ts b/src/app/routes/supply-goods/components/carload/carload.component.spec.ts new file mode 100644 index 00000000..00b3e821 --- /dev/null +++ b/src/app/routes/supply-goods/components/carload/carload.component.spec.ts @@ -0,0 +1,31 @@ +/* + * @Description: + * @Author: wsm + * @Date: 2021-07-08 15:46:29 + * @LastEditTime: 2021-12-01 10:02:07 + * @LastEditors: Please set LastEditors + * @Reference: + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { SupplyGoodsComponentListCarloadComponent } from './carload.component'; + +describe('SupplyGoodsComponentListCarloadComponent', () => { + let component: SupplyGoodsComponentListCarloadComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [SupplyGoodsComponentListCarloadComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SupplyGoodsComponentListCarloadComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/supply-goods/components/carload/carload.component.ts b/src/app/routes/supply-goods/components/carload/carload.component.ts new file mode 100644 index 00000000..1145ae70 --- /dev/null +++ b/src/app/routes/supply-goods/components/carload/carload.component.ts @@ -0,0 +1,398 @@ +/* + * @Description: + * @Author: wsm + * @Date: 2021-07-15 09:42:57 + * @LastEditTime: 2021-12-01 10:36:54 + * @LastEditors: Please set LastEditors + * @Reference: + */ +import { AfterViewInit, Component, OnInit, TemplateRef, ViewChild } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; +import { STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; +import { ModalHelper } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { filter } from 'rxjs/operators'; + + +@Component({ + selector: 'app-supply-goods-components-list-carload', + templateUrl: './carload.component.html', + styleUrls: ['./carload.component.less'], +}) +export class SupplyGoodsComponentListCarloadComponent implements OnInit, AfterViewInit { + @ViewChild('st', { static: true }) st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + validateForm!: FormGroup; + @ViewChild('exportTemplate') + exportTemplate!: TemplateRef; + ui: SFUISchema = {}; + mode: any = 'search'; + tabs = ['全部', '待审核', '待支付', '待发货', '待收货', '已完成']; + exportFieldList = [ + '订单号', + '下单时间', + '支付方式', + '订单金额', + '订单状态', + '下单商家', + 'SKU信息(SKUID,商品名称+规格名称,数量)', + '配送方式', + '收件人', + '收件人电话', + '收件人地址', + ]; + listData: any; + orderStatus: any = '0'; // 订单状态, 10为已提交待付款, 20为已付款待发,30为已发货待收货,50取消订单,40 已完成 + nzSelectedIndex = 0; + total = 1; + loading = false; + pageSize = 20; + pageIndex = 1; + toSendCount = 0; + addTimeStart = ''; + addTimeEnd = ''; + sfExpand = false; + _$expand = false; + + schema!: SFSchema; + payStatus: any; + constructor( + private fb: FormBuilder, + private modal: NzModalService, + private router: Router, + private ar: ActivatedRoute, + private modalHelper: ModalHelper, + ) {} + + ngOnInit(): void { + this.getList(); + this.initSF(); + this.initUI(); + } + + ngAfterViewInit() { + // this.router.events.pipe(filter((evt) => evt instanceof NavigationEnd)).subscribe(() => { + // + // }); + } + + initSF() { + this.schema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true, + }, + }, + storeName: { title: '企业名称', type: 'string', ui: { showRequired: false } }, + contactsName: { + title: '联系人', + type: 'string', + ui: { + showRequired: false, + }, + }, + unifiedSocialCreditCode: { + title: '税源地', + type: 'string', + ui: { + showRequired: false, + }, + }, + enStatus: { + type: 'string', + title: '货主状态', + enum: [ + { label: '全部', value: '' }, + { label: '正常', value: 0 }, + { label: '冻结', value: 1 }, + { label: '废弃', value: 2 }, + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value, + }, + }, + }, + enStatus2: { + type: 'string', + title: 'CRM审核状态', + enum: [ + { label: '全部', value: '' }, + { label: '正常', value: 0 }, + { label: '冻结', value: 1 }, + { label: '废弃', value: 2 }, + ], + default: '', + ui: { + widget: 'select', + visibleIf: { + expand: (value: boolean) => value, + }, + }, + }, + }, + }; + this.ui = { '*': { spanLabelFixed: 90, grid: { span: 8, gutter: 4 }, enter: () => this.st.load() } }; + } + initUI() { + this.ui = { + '*': { + spanLabelFixed: 90, + grid: { span: 8 }, + }, + }; + } + tabChange(i: number) { + this.changeIndex(i); + this.getList(); + } + changeIndex(i: number) { + if (i === 0) { + this.orderStatus = '0'; + this.payStatus = null; + } else if (i === 1) { + this.orderStatus = '5'; + this.payStatus = null; + } else if (i === 2) { + this.orderStatus = null; + this.payStatus = '10'; + } else if (i === 3) { + this.orderStatus = '20'; + this.payStatus = null; + } else if (i === 4) { + this.orderStatus = '30'; + this.payStatus = null; + } else if (i === 5) { + this.orderStatus = '40'; + this.payStatus = null; + } + this.pageIndex = 1; + } + getList(type?: string) { + // this.loading = true; + const params: any = { + pageSize: this.pageSize, + pageIndex: this.pageIndex, + ...this.sf?.value, + orderStatus: this.orderStatus, + payStatus: this.payStatus, + createTime: this.sf?.value.createTime || [], + time: {}, + }; + if (this.sf?.value?.createTime) { + delete params.createTime; + params.time.start = this.sf?.value?.createTime[0]; + params.time.end = this.sf?.value?.createTime[1]; + } + delete params.expand; + if (type === 'search') { + params.pageIndex = 1; + } + // this.service.request(this.service.$api_get_page, params).subscribe((res) => { + // this.loading = false; + // this.listData = res.orderPage.records; + // this.toSendCount = res.toSendCount; + // this.listData.forEach((element: { goodsList: { goodsSpecJson: string }[] }) => { + // element.goodsList.forEach((item: { goodsSpecJson: string }) => { + // if (item.goodsSpecJson) { + // item.goodsSpecJson = JSON.parse(item.goodsSpecJson); + // } + // }); + // }); + // this.total = res.orderPage.total; + // }); + } + + orderExport() { + // this.service.exportStart(params, this.service.$api_export); + this.modal.create({ + nzTitle: '订单导出', + nzContent: this.exportTemplate, + // nzContent: `待导出订单总数:${this.pageInfo.total}条,确定要导出吗?`, + nzOnOk: () => { + const params: any = { + pageSize: this.pageSize, + pageIndex: this.pageIndex, + ...this.sf?.value, + orderStatus: this.orderStatus, + // createTime: this.sf?.value.createTime || [], + }; + delete params.expand; + }, + }); + } + + goDetail(data: any) { + this.router.navigate(['../order-detail', data.orderSn], { relativeTo: this.ar }); + } + + // 批量发货 + deliverBelivery() { + this.router.navigate(['../order-batch-delivery'], { relativeTo: this.ar }); + } + changePageIndex(pageIndex: number) { + this.pageIndex = pageIndex; + this.getList(); + } + changePageSize(value: number) { + this.pageSize = value; + this.getList(); + } + expandToggle() { + this.sfExpand = !this.sfExpand; + this.sf?.setValue('/expand', this.sfExpand); + } + + // 修改运单 + updateLogistics(data: any) { + // 如果是多个运单 + if (data.deliveryList.length > 1) { + this.updateLogisticsList(data); + } else { + data.deliveryAddrId = data.deliveryList[0].deliveryAddrId; + data.deliveryCorpSn = data.deliveryList[0].deliveryCorpSn; + data.deliverySn = data.deliveryList[0].deliverySn; // 原物流单号 + data.expressName = data.deliveryList[0].expressName; // 原物流公司 + data.sendName = data.deliveryList[0].sendName; + data.sendMobile = data.deliveryList[0].sendMobile; + data.sendAddr = data.deliveryList[0].sendAddr; + data.orderExpressItemVOList = data.deliveryList[0].orderExpressItemVOList; // 运单对应的发货商品信息 + this.updateLogisticsPop(data); + } + } + + // 修改运单中间页List + updateLogisticsList(data: any) { + const modalRef = this.modal.create({ + nzTitle: '运单信息', + nzWidth: 1200, + // nzContent: OrderComponentsOrderLogisticsmessageComponent, + nzComponentParams: { + listData: data, + }, + nzFooter: null, + }); + modalRef.afterClose.subscribe((result) => { + if (result === true) { + this.getList(); + } + }); + } + + // 修改运单弹窗 + updateLogisticsPop(data: any) { + const modalRef = this.modal.create({ + nzTitle: '已发货商品', + nzWidth: 1200, + // nzContent: OrderComponentsOrderDeliverGoodsUpdateComponent, + nzComponentParams: { + listData: data, + }, + nzFooter: null, + }); + modalRef.afterClose.subscribe((result) => { + if (result === true) { + this.getList(); + } + }); + } + + // 立即发货 + deliverGoods(data: any) { + // const modalRef = this.modal.create({ + // nzTitle: '订单发货', + // nzWidth: 1200, + // nzContent: OrderComponentsOrderDelivergoodsComponent, + // nzComponentParams: { + // listData: data, + // }, + // nzFooter: null, + // }); + // modalRef.afterOpen.subscribe(() => {}); + // modalRef.afterClose.subscribe((result) => { + // if (result === true) { + // this.getList(); + // } + // }); + this.router.navigate(['../order-deliver-goods'], { relativeTo: this.ar }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this.sfExpand = false; + } + /** + * 立即确认 + */ + deliversure(val: any) { + const modalRef = this.modal.create({ + nzTitle: '订单确认', + nzWidth: 700, + // nzContent: OrderComponentsOrderOrderlistOrderSureComponent, + nzComponentParams: { + record: val, + }, + nzFooter: null, + }); + modalRef.afterOpen.subscribe(() => {}); + modalRef.afterClose.subscribe((result) => { + if (result === true) { + this.getList(); + } + }); + } + /** + * 付款审核 + */ + paymentReview(data: any) { + const dialogData = { + ...data, + }; + // this.modalHelper.create(OrderComponentsOrderOrderlistPaymentReviewComponent, { dialogData }, { size: 900 }).subscribe((res) => { + // if (res === '2') { + // this.getList(); + // } + // }); + } + /** + * 修改价格 + */ + modifyPrice(data: any) { + const dialogData = { + ...data, + }; + // this.modalHelper.create(OrderComponentsOrderOrderlistModifyPriceComponent, { dialogData }, { size: 900 }).subscribe((res) => { + // if (res === '2') { + // this.getList(); + // } + // }); + } + /** + * 审核 + */ + orderReview(data: any) { + const dialogData = { + ...data, + }; + // this.modalHelper.create(OrderReviewComponent, { dialogData }, { size: 900 }).subscribe((res) => { + // if (res === '2') { + // this.getList(); + // } + // }); + } + /** + * 查询字段个数navigate + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } +} diff --git a/src/app/routes/supply-goods/components/list/list.component.html b/src/app/routes/supply-goods/components/list/list.component.html new file mode 100644 index 00000000..97942916 --- /dev/null +++ b/src/app/routes/supply-goods/components/list/list.component.html @@ -0,0 +1,19 @@ + + + + + + + + + + + + diff --git a/src/app/routes/supply-goods/components/list/list.component.spec.ts b/src/app/routes/supply-goods/components/list/list.component.spec.ts new file mode 100644 index 00000000..35a8977b --- /dev/null +++ b/src/app/routes/supply-goods/components/list/list.component.spec.ts @@ -0,0 +1,31 @@ +/* + * @Author: your name + * @Date: 2021-12-01 09:25:32 + * @LastEditTime: 2021-12-01 09:55:39 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\supply-goods\components\list\list.component.spec.ts + */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { SupplyGoodsComponentListComponent } from './list.component'; + +describe('SupplyGoodsComponentListComponent', () => { + let component: SupplyGoodsComponentListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [SupplyGoodsComponentListComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SupplyGoodsComponentListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/supply-goods/components/list/list.component.ts b/src/app/routes/supply-goods/components/list/list.component.ts new file mode 100644 index 00000000..b950cec9 --- /dev/null +++ b/src/app/routes/supply-goods/components/list/list.component.ts @@ -0,0 +1,22 @@ +/* + * @Author: your name + * @Date: 2021-12-01 09:25:32 + * @LastEditTime: 2021-12-01 09:49:32 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\supply-goods\components\list\list.component.ts + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +@Component({ + selector: 'app-supply-goods-components-list', + templateUrl: './list.component.html', +}) +export class SupplyGoodsComponentListComponent implements OnInit { + constructor(private ar: ActivatedRoute) {} + nzSelectedIndex = 0; + ngOnInit(): void { + this.nzSelectedIndex = this.ar.snapshot.queryParams.nzSelectedIndex; + } +} diff --git a/src/app/routes/supply-goods/services/supply-goods.service.ts b/src/app/routes/supply-goods/services/supply-goods.service.ts new file mode 100644 index 00000000..1eea08f1 --- /dev/null +++ b/src/app/routes/supply-goods/services/supply-goods.service.ts @@ -0,0 +1,23 @@ +/* + * @Author: your name + * @Date: 2021-11-29 15:22:34 + * @LastEditTime: 2021-12-01 10:33:33 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\usercenter\services\usercenter.service.ts + */ +import { Injectable, Injector } from '@angular/core'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { BaseService } from 'src/app/shared/services/core/base.service'; +import { EAFileUtil } from 'src/app/shared/utils/file.util'; + +@Injectable({ + providedIn: 'root', +}) +export class SupplyGoodsService extends BaseService { + + constructor(public injector: Injector) { + super(injector); + } +} diff --git a/src/app/routes/supply-goods/supply-goods-routing.module.ts b/src/app/routes/supply-goods/supply-goods-routing.module.ts new file mode 100644 index 00000000..4543b370 --- /dev/null +++ b/src/app/routes/supply-goods/supply-goods-routing.module.ts @@ -0,0 +1,22 @@ +/* + * @Author: your name + * @Date: 2021-11-29 15:22:34 + * @LastEditTime: 2021-12-01 09:52:45 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\usercenter\usercenter-routing.module.ts + */ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { SupplyGoodsComponentListComponent } from './components/list/list.component'; + + +const routes: Routes = [ + { path: 'list', component: SupplyGoodsComponentListComponent} +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class SupplyGoodsRoutingModule {} diff --git a/src/app/routes/supply-goods/supply-goods.module.ts b/src/app/routes/supply-goods/supply-goods.module.ts new file mode 100644 index 00000000..399a3c44 --- /dev/null +++ b/src/app/routes/supply-goods/supply-goods.module.ts @@ -0,0 +1,24 @@ +/* + * @Author: your name + * @Date: 2021-11-29 15:22:34 + * @LastEditTime: 2021-12-01 10:03:01 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +import { NgModule } from '@angular/core'; +import { SharedModule } from '@shared'; +import { SupplyGoodsComponentListCarloadComponent } from './components/carload/carload.component'; +import { SupplyGoodsComponentListComponent } from './components/list/list.component'; + +import { SupplyGoodsRoutingModule } from './supply-goods-routing.module'; + +const COMPONENTS = [ + SupplyGoodsComponentListComponent, + SupplyGoodsComponentListCarloadComponent +]; + +@NgModule({ + imports: [SharedModule, SupplyGoodsRoutingModule], + declarations: [...COMPONENTS], +}) +export class SupplyGoodsModule {} diff --git a/src/app/routes/usercenter/components/driver/captain/captain.component.html b/src/app/routes/usercenter/components/driver/captain/captain.component.html index 76715051..bcc09f33 100644 --- a/src/app/routes/usercenter/components/driver/captain/captain.component.html +++ b/src/app/routes/usercenter/components/driver/captain/captain.component.html @@ -1,13 +1,13 @@ - + diff --git a/src/app/routes/usercenter/components/driver/captain/captain.component.ts b/src/app/routes/usercenter/components/driver/captain/captain.component.ts index b1fc9c7a..f3f2f016 100644 --- a/src/app/routes/usercenter/components/driver/captain/captain.component.ts +++ b/src/app/routes/usercenter/components/driver/captain/captain.component.ts @@ -106,57 +106,14 @@ export class UserCenterComponentsDriverCaptainComponent implements OnInit { placeholder: '请输入手机号', }, }, - enStatus: { + phon747e: { + title: '银行卡号', type: 'string', - title: '实名状态', - enum: [ - { label: '全部', value: '' }, - { label: '正常', value: 0 }, - { label: '冻结', value: 1 }, - { label: '废弃', value: 2 }, - ], - default: '', ui: { - widget: 'select', - visibleIf: { - expand: (value: boolean) => value, - }, - }, - }, - enStatus2: { - type: 'string', - title: '驾驶证状态', - enum: [ - { label: '全部', value: '' }, - { label: '正常', value: 0 }, - { label: '冻结', value: 1 }, - { label: '废弃', value: 2 }, - ], - default: '', - ui: { - widget: 'select', - visibleIf: { - expand: (value: boolean) => value, - }, - }, - }, - enStatus23: { - type: 'string', - title: '从业资格证状态', - enum: [ - { label: '全部', value: '' }, - { label: '正常', value: 0 }, - { label: '冻结', value: 1 }, - { label: '废弃', value: 2 }, - ], - default: '', - ui: { - widget: 'select', - visibleIf: { - expand: (value: boolean) => value, - }, + placeholder: '请输入银行卡号', }, }, + phone2: { title: '业务员手机号', type: 'string', @@ -164,12 +121,15 @@ export class UserCenterComponentsDriverCaptainComponent implements OnInit { maxLength: 11, ui: { placeholder: '请输入手机号', + visibleIf: { + expand: (value: boolean) => value + } }, }, }, }; - this.ui = { '*': { spanLabelFixed: 180, grid: { span: 8, gutter: 4 }, enter: () => this.st.load() } }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 }, enter: () => this.st.load() } }; } initST() { @@ -179,36 +139,7 @@ export class UserCenterComponentsDriverCaptainComponent implements OnInit { { title: '手机号', className: 'text-center', index: 'contactsName' }, { title: '承运总单量', className: 'text-center', render: 'enterpriseName' }, { title: '当前车辆', className: 'text-center', index: 'unifiedSocialCreditCode' }, - { title: '实名认证状态', className: 'text-center', index: 'effectiveDateStr', - type: 'badge', - badge: { - 正常: { text: '正常', color: 'success' }, - 冻结: { text: '冻结', color: 'warning' }, - 废弃: { text: '废弃', color: 'default' }, - }, - }, - { - title: '驾驶证状态', - className: 'text-center', - index: 'enStatusStr2', - type: 'badge', - badge: { - 正常: { text: '正常', color: 'success' }, - 冻结: { text: '冻结', color: 'warning' }, - 废弃: { text: '废弃', color: 'default' }, - }, - }, - { - title: '从业资格证状态', - className: 'text-center', - index: 'enStatusStr3', - type: 'badge', - badge: { - 正常: { text: '正常', color: 'success' }, - 冻结: { text: '冻结', color: 'warning' }, - 废弃: { text: '废弃', color: 'default' }, - }, - }, + { title: '银行卡号', className: 'text-center', index: 'unifiedSocialCreditCode' }, { title: '推广业务员', className: 'text-center', index: 'unifiedSocialCreditCode2' }, { title: '注册时间', className: 'text-center', index: 'unifiedSocialCreditCode3' }, { @@ -219,7 +150,7 @@ export class UserCenterComponentsDriverCaptainComponent implements OnInit { { text: '查看', click: (item) => { - this.router.navigate(['./detail', item.tenantId], { relativeTo: this.ar }); + this.router.navigate(['/usercenter/driver/detail', item.tenantId], { relativeTo: this.ar }); // this.router.navigate(['./view', item.id], { relativeTo: this.ar, queryParams: { tenantId: item.tenantId } }); }, }, diff --git a/src/assets/mocks/menu-data.json b/src/assets/mocks/menu-data.json index e556252b..eabd0818 100644 --- a/src/assets/mocks/menu-data.json +++ b/src/assets/mocks/menu-data.json @@ -101,6 +101,17 @@ ] }] }, + { + "text": "货源管理", + "icon": "anticon anticon-dashboard", + "group": true, + "children": [ + { + "text": "货源管理", + "link": "/supplygoods/list" + } + ] + }, { "text": "系统设置", "icon": "anticon anticon-dashboard", From b88e3137851a6eea194c7cf8ae92c1073acb44f1 Mon Sep 17 00:00:00 2001 From: Taric Xin Date: Wed, 1 Dec 2021 10:58:24 +0800 Subject: [PATCH 0016/1600] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AF=8C=E6=96=87?= =?UTF-8?q?=E6=9C=AC=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agreement-config.component.html | 39 + .../agreement-config.component.less | 90 + .../agreement-config.component.ts | 125 + .../sys-setting/sys-setting-routing.module.ts | 2 + .../routes/sys-setting/sys-setting.module.ts | 4 +- src/app/shared/index.ts | 4 + src/app/shared/shared-third.module.ts | 33 + src/app/shared/shared.module.ts | 2 + src/app/shared/widget/st-widget.module.ts | 4 +- src/assets/mocks/menu-data.json | 2 +- src/assets/tinymce/icons/default/icons.js | 172 + src/assets/tinymce/icons/default/icons.min.js | 1 + src/assets/tinymce/jquery.tinymce.min.js | 92 + src/assets/tinymce/langs/readme.md | 3 + src/assets/tinymce/langs/zh_CN.js | 261 + src/assets/tinymce/license.txt | 504 + src/assets/tinymce/plugins/advlist/plugin.js | 278 + .../tinymce/plugins/advlist/plugin.min.js | 9 + src/assets/tinymce/plugins/anchor/plugin.js | 216 + .../tinymce/plugins/anchor/plugin.min.js | 9 + src/assets/tinymce/plugins/autolink/plugin.js | 185 + .../tinymce/plugins/autolink/plugin.min.js | 9 + .../tinymce/plugins/autoresize/plugin.js | 171 + .../tinymce/plugins/autoresize/plugin.min.js | 9 + src/assets/tinymce/plugins/autosave/plugin.js | 212 + .../tinymce/plugins/autosave/plugin.min.js | 9 + src/assets/tinymce/plugins/bbcode/plugin.js | 99 + .../tinymce/plugins/bbcode/plugin.min.js | 9 + src/assets/tinymce/plugins/charmap/plugin.js | 1706 + .../tinymce/plugins/charmap/plugin.min.js | 9 + src/assets/tinymce/plugins/code/plugin.js | 92 + src/assets/tinymce/plugins/code/plugin.min.js | 9 + .../tinymce/plugins/codesample/plugin.js | 2104 + .../tinymce/plugins/codesample/plugin.min.js | 9 + .../tinymce/plugins/colorpicker/plugin.js | 22 + .../tinymce/plugins/colorpicker/plugin.min.js | 9 + .../tinymce/plugins/contextmenu/plugin.js | 22 + .../tinymce/plugins/contextmenu/plugin.min.js | 9 + .../tinymce/plugins/directionality/plugin.js | 314 + .../plugins/directionality/plugin.min.js | 9 + .../plugins/emoticons/js/emojiimages.js | 9424 +++++ .../plugins/emoticons/js/emojiimages.min.js | 3 + .../tinymce/plugins/emoticons/js/emojis.js | 9423 +++++ .../plugins/emoticons/js/emojis.min.js | 2 + .../tinymce/plugins/emoticons/plugin.js | 605 + .../tinymce/plugins/emoticons/plugin.min.js | 9 + src/assets/tinymce/plugins/fullpage/plugin.js | 544 + .../tinymce/plugins/fullpage/plugin.min.js | 9 + .../tinymce/plugins/fullscreen/plugin.js | 979 + .../tinymce/plugins/fullscreen/plugin.min.js | 9 + src/assets/tinymce/plugins/help/plugin.js | 846 + src/assets/tinymce/plugins/help/plugin.min.js | 9 + src/assets/tinymce/plugins/hr/plugin.js | 46 + src/assets/tinymce/plugins/hr/plugin.min.js | 9 + src/assets/tinymce/plugins/image/plugin.js | 1664 + .../tinymce/plugins/image/plugin.min.js | 9 + .../tinymce/plugins/imagetools/plugin.js | 1348 + .../tinymce/plugins/imagetools/plugin.min.js | 9 + .../tinymce/plugins/importcss/plugin.js | 343 + .../tinymce/plugins/importcss/plugin.min.js | 9 + .../tinymce/plugins/insertdatetime/plugin.js | 177 + .../plugins/insertdatetime/plugin.min.js | 9 + .../tinymce/plugins/legacyoutput/plugin.js | 199 + .../plugins/legacyoutput/plugin.min.js | 9 + src/assets/tinymce/plugins/link/plugin.js | 1290 + src/assets/tinymce/plugins/link/plugin.min.js | 9 + src/assets/tinymce/plugins/lists/plugin.js | 2148 + .../tinymce/plugins/lists/plugin.min.js | 9 + src/assets/tinymce/plugins/media/plugin.js | 1315 + .../tinymce/plugins/media/plugin.min.js | 9 + .../tinymce/plugins/nonbreaking/plugin.js | 101 + .../tinymce/plugins/nonbreaking/plugin.min.js | 9 + .../tinymce/plugins/noneditable/plugin.js | 117 + .../tinymce/plugins/noneditable/plugin.min.js | 9 + .../tinymce/plugins/pagebreak/plugin.js | 107 + .../tinymce/plugins/pagebreak/plugin.min.js | 9 + src/assets/tinymce/plugins/paste/plugin.js | 1764 + .../tinymce/plugins/paste/plugin.min.js | 9 + src/assets/tinymce/plugins/preview/plugin.js | 127 + .../tinymce/plugins/preview/plugin.min.js | 9 + src/assets/tinymce/plugins/print/plugin.js | 53 + .../tinymce/plugins/print/plugin.min.js | 9 + .../tinymce/plugins/quickbars/plugin.js | 491 + .../tinymce/plugins/quickbars/plugin.min.js | 9 + src/assets/tinymce/plugins/save/plugin.js | 119 + src/assets/tinymce/plugins/save/plugin.min.js | 9 + .../tinymce/plugins/searchreplace/plugin.js | 1163 + .../plugins/searchreplace/plugin.min.js | 9 + .../tinymce/plugins/spellchecker/plugin.js | 737 + .../plugins/spellchecker/plugin.min.js | 9 + src/assets/tinymce/plugins/tabfocus/plugin.js | 129 + .../tinymce/plugins/tabfocus/plugin.min.js | 9 + src/assets/tinymce/plugins/table/plugin.js | 10495 +++++ .../tinymce/plugins/table/plugin.min.js | 9 + src/assets/tinymce/plugins/template/plugin.js | 577 + .../tinymce/plugins/template/plugin.min.js | 9 + .../tinymce/plugins/textcolor/plugin.js | 22 + .../tinymce/plugins/textcolor/plugin.min.js | 9 + .../tinymce/plugins/textpattern/plugin.js | 1390 + .../tinymce/plugins/textpattern/plugin.min.js | 9 + src/assets/tinymce/plugins/toc/plugin.js | 236 + src/assets/tinymce/plugins/toc/plugin.min.js | 9 + .../tinymce/plugins/visualblocks/plugin.js | 104 + .../plugins/visualblocks/plugin.min.js | 9 + .../tinymce/plugins/visualchars/plugin.js | 541 + .../tinymce/plugins/visualchars/plugin.min.js | 9 + .../tinymce/plugins/wordcount/plugin.js | 416 + .../tinymce/plugins/wordcount/plugin.min.js | 9 + src/assets/tinymce/readme.md | 77 + .../tinymce/skins/content/dark/content.css | 72 + .../skins/content/dark/content.min.css | 8 + .../skins/content/dark/content.min.css.map | 1 + .../tinymce/skins/content/default/content.css | 67 + .../skins/content/default/content.min.css | 8 + .../skins/content/default/content.min.css.map | 1 + .../skins/content/document/content.css | 72 + .../skins/content/document/content.min.css | 8 + .../content/document/content.min.css.map | 1 + .../tinymce/skins/content/writer/content.css | 68 + .../skins/content/writer/content.min.css | 8 + .../skins/content/writer/content.min.css.map | 1 + .../tinymce/skins/ui/oxide-dark/content.css | 710 + .../skins/ui/oxide-dark/content.inline.css | 722 + .../ui/oxide-dark/content.inline.min.css | 8 + .../ui/oxide-dark/content.inline.min.css.map | 1 + .../skins/ui/oxide-dark/content.min.css | 8 + .../skins/ui/oxide-dark/content.min.css.map | 1 + .../skins/ui/oxide-dark/content.mobile.css | 29 + .../ui/oxide-dark/content.mobile.min.css | 8 + .../ui/oxide-dark/content.mobile.min.css.map | 1 + .../ui/oxide-dark/fonts/tinymce-mobile.woff | Bin 0 -> 4624 bytes .../tinymce/skins/ui/oxide-dark/skin.css | 3024 ++ .../tinymce/skins/ui/oxide-dark/skin.min.css | 8 + .../skins/ui/oxide-dark/skin.min.css.map | 1 + .../skins/ui/oxide-dark/skin.mobile.css | 673 + .../skins/ui/oxide-dark/skin.mobile.min.css | 8 + .../ui/oxide-dark/skin.mobile.min.css.map | 1 + .../skins/ui/oxide-dark/skin.shadowdom.css | 36 + .../ui/oxide-dark/skin.shadowdom.min.css | 8 + .../ui/oxide-dark/skin.shadowdom.min.css.map | 1 + src/assets/tinymce/skins/ui/oxide/content.css | 728 + .../tinymce/skins/ui/oxide/content.inline.css | 722 + .../skins/ui/oxide/content.inline.min.css | 8 + .../skins/ui/oxide/content.inline.min.css.map | 1 + .../tinymce/skins/ui/oxide/content.min.css | 8 + .../skins/ui/oxide/content.min.css.map | 1 + .../tinymce/skins/ui/oxide/content.mobile.css | 29 + .../skins/ui/oxide/content.mobile.min.css | 8 + .../skins/ui/oxide/content.mobile.min.css.map | 1 + .../skins/ui/oxide/fonts/tinymce-mobile.woff | Bin 0 -> 4624 bytes src/assets/tinymce/skins/ui/oxide/skin.css | 3024 ++ .../tinymce/skins/ui/oxide/skin.min.css | 8 + .../tinymce/skins/ui/oxide/skin.min.css.map | 1 + .../tinymce/skins/ui/oxide/skin.mobile.css | 673 + .../skins/ui/oxide/skin.mobile.min.css | 8 + .../skins/ui/oxide/skin.mobile.min.css.map | 1 + .../tinymce/skins/ui/oxide/skin.shadowdom.css | 36 + .../skins/ui/oxide/skin.shadowdom.min.css | 8 + .../skins/ui/oxide/skin.shadowdom.min.css.map | 1 + src/assets/tinymce/themes/mobile/theme.js | 13592 +++++++ src/assets/tinymce/themes/mobile/theme.min.js | 9 + src/assets/tinymce/themes/silver/theme.js | 32458 ++++++++++++++++ src/assets/tinymce/themes/silver/theme.min.js | 9 + src/assets/tinymce/tinymce.d.ts | 2916 ++ src/assets/tinymce/tinymce.js | 29786 ++++++++++++++ src/assets/tinymce/tinymce.min.js | 9 + 166 files changed, 145881 insertions(+), 4 deletions(-) create mode 100644 src/app/routes/sys-setting/components/agreement-config/agreement-config.component.html create mode 100644 src/app/routes/sys-setting/components/agreement-config/agreement-config.component.less create mode 100644 src/app/routes/sys-setting/components/agreement-config/agreement-config.component.ts create mode 100644 src/app/shared/shared-third.module.ts create mode 100644 src/assets/tinymce/icons/default/icons.js create mode 100644 src/assets/tinymce/icons/default/icons.min.js create mode 100644 src/assets/tinymce/jquery.tinymce.min.js create mode 100644 src/assets/tinymce/langs/readme.md create mode 100644 src/assets/tinymce/langs/zh_CN.js create mode 100644 src/assets/tinymce/license.txt create mode 100644 src/assets/tinymce/plugins/advlist/plugin.js create mode 100644 src/assets/tinymce/plugins/advlist/plugin.min.js create mode 100644 src/assets/tinymce/plugins/anchor/plugin.js create mode 100644 src/assets/tinymce/plugins/anchor/plugin.min.js create mode 100644 src/assets/tinymce/plugins/autolink/plugin.js create mode 100644 src/assets/tinymce/plugins/autolink/plugin.min.js create mode 100644 src/assets/tinymce/plugins/autoresize/plugin.js create mode 100644 src/assets/tinymce/plugins/autoresize/plugin.min.js create mode 100644 src/assets/tinymce/plugins/autosave/plugin.js create mode 100644 src/assets/tinymce/plugins/autosave/plugin.min.js create mode 100644 src/assets/tinymce/plugins/bbcode/plugin.js create mode 100644 src/assets/tinymce/plugins/bbcode/plugin.min.js create mode 100644 src/assets/tinymce/plugins/charmap/plugin.js create mode 100644 src/assets/tinymce/plugins/charmap/plugin.min.js create mode 100644 src/assets/tinymce/plugins/code/plugin.js create mode 100644 src/assets/tinymce/plugins/code/plugin.min.js create mode 100644 src/assets/tinymce/plugins/codesample/plugin.js create mode 100644 src/assets/tinymce/plugins/codesample/plugin.min.js create mode 100644 src/assets/tinymce/plugins/colorpicker/plugin.js create mode 100644 src/assets/tinymce/plugins/colorpicker/plugin.min.js create mode 100644 src/assets/tinymce/plugins/contextmenu/plugin.js create mode 100644 src/assets/tinymce/plugins/contextmenu/plugin.min.js create mode 100644 src/assets/tinymce/plugins/directionality/plugin.js create mode 100644 src/assets/tinymce/plugins/directionality/plugin.min.js create mode 100644 src/assets/tinymce/plugins/emoticons/js/emojiimages.js create mode 100644 src/assets/tinymce/plugins/emoticons/js/emojiimages.min.js create mode 100644 src/assets/tinymce/plugins/emoticons/js/emojis.js create mode 100644 src/assets/tinymce/plugins/emoticons/js/emojis.min.js create mode 100644 src/assets/tinymce/plugins/emoticons/plugin.js create mode 100644 src/assets/tinymce/plugins/emoticons/plugin.min.js create mode 100644 src/assets/tinymce/plugins/fullpage/plugin.js create mode 100644 src/assets/tinymce/plugins/fullpage/plugin.min.js create mode 100644 src/assets/tinymce/plugins/fullscreen/plugin.js create mode 100644 src/assets/tinymce/plugins/fullscreen/plugin.min.js create mode 100644 src/assets/tinymce/plugins/help/plugin.js create mode 100644 src/assets/tinymce/plugins/help/plugin.min.js create mode 100644 src/assets/tinymce/plugins/hr/plugin.js create mode 100644 src/assets/tinymce/plugins/hr/plugin.min.js create mode 100644 src/assets/tinymce/plugins/image/plugin.js create mode 100644 src/assets/tinymce/plugins/image/plugin.min.js create mode 100644 src/assets/tinymce/plugins/imagetools/plugin.js create mode 100644 src/assets/tinymce/plugins/imagetools/plugin.min.js create mode 100644 src/assets/tinymce/plugins/importcss/plugin.js create mode 100644 src/assets/tinymce/plugins/importcss/plugin.min.js create mode 100644 src/assets/tinymce/plugins/insertdatetime/plugin.js create mode 100644 src/assets/tinymce/plugins/insertdatetime/plugin.min.js create mode 100644 src/assets/tinymce/plugins/legacyoutput/plugin.js create mode 100644 src/assets/tinymce/plugins/legacyoutput/plugin.min.js create mode 100644 src/assets/tinymce/plugins/link/plugin.js create mode 100644 src/assets/tinymce/plugins/link/plugin.min.js create mode 100644 src/assets/tinymce/plugins/lists/plugin.js create mode 100644 src/assets/tinymce/plugins/lists/plugin.min.js create mode 100644 src/assets/tinymce/plugins/media/plugin.js create mode 100644 src/assets/tinymce/plugins/media/plugin.min.js create mode 100644 src/assets/tinymce/plugins/nonbreaking/plugin.js create mode 100644 src/assets/tinymce/plugins/nonbreaking/plugin.min.js create mode 100644 src/assets/tinymce/plugins/noneditable/plugin.js create mode 100644 src/assets/tinymce/plugins/noneditable/plugin.min.js create mode 100644 src/assets/tinymce/plugins/pagebreak/plugin.js create mode 100644 src/assets/tinymce/plugins/pagebreak/plugin.min.js create mode 100644 src/assets/tinymce/plugins/paste/plugin.js create mode 100644 src/assets/tinymce/plugins/paste/plugin.min.js create mode 100644 src/assets/tinymce/plugins/preview/plugin.js create mode 100644 src/assets/tinymce/plugins/preview/plugin.min.js create mode 100644 src/assets/tinymce/plugins/print/plugin.js create mode 100644 src/assets/tinymce/plugins/print/plugin.min.js create mode 100644 src/assets/tinymce/plugins/quickbars/plugin.js create mode 100644 src/assets/tinymce/plugins/quickbars/plugin.min.js create mode 100644 src/assets/tinymce/plugins/save/plugin.js create mode 100644 src/assets/tinymce/plugins/save/plugin.min.js create mode 100644 src/assets/tinymce/plugins/searchreplace/plugin.js create mode 100644 src/assets/tinymce/plugins/searchreplace/plugin.min.js create mode 100644 src/assets/tinymce/plugins/spellchecker/plugin.js create mode 100644 src/assets/tinymce/plugins/spellchecker/plugin.min.js create mode 100644 src/assets/tinymce/plugins/tabfocus/plugin.js create mode 100644 src/assets/tinymce/plugins/tabfocus/plugin.min.js create mode 100644 src/assets/tinymce/plugins/table/plugin.js create mode 100644 src/assets/tinymce/plugins/table/plugin.min.js create mode 100644 src/assets/tinymce/plugins/template/plugin.js create mode 100644 src/assets/tinymce/plugins/template/plugin.min.js create mode 100644 src/assets/tinymce/plugins/textcolor/plugin.js create mode 100644 src/assets/tinymce/plugins/textcolor/plugin.min.js create mode 100644 src/assets/tinymce/plugins/textpattern/plugin.js create mode 100644 src/assets/tinymce/plugins/textpattern/plugin.min.js create mode 100644 src/assets/tinymce/plugins/toc/plugin.js create mode 100644 src/assets/tinymce/plugins/toc/plugin.min.js create mode 100644 src/assets/tinymce/plugins/visualblocks/plugin.js create mode 100644 src/assets/tinymce/plugins/visualblocks/plugin.min.js create mode 100644 src/assets/tinymce/plugins/visualchars/plugin.js create mode 100644 src/assets/tinymce/plugins/visualchars/plugin.min.js create mode 100644 src/assets/tinymce/plugins/wordcount/plugin.js create mode 100644 src/assets/tinymce/plugins/wordcount/plugin.min.js create mode 100644 src/assets/tinymce/readme.md create mode 100644 src/assets/tinymce/skins/content/dark/content.css create mode 100644 src/assets/tinymce/skins/content/dark/content.min.css create mode 100644 src/assets/tinymce/skins/content/dark/content.min.css.map create mode 100644 src/assets/tinymce/skins/content/default/content.css create mode 100644 src/assets/tinymce/skins/content/default/content.min.css create mode 100644 src/assets/tinymce/skins/content/default/content.min.css.map create mode 100644 src/assets/tinymce/skins/content/document/content.css create mode 100644 src/assets/tinymce/skins/content/document/content.min.css create mode 100644 src/assets/tinymce/skins/content/document/content.min.css.map create mode 100644 src/assets/tinymce/skins/content/writer/content.css create mode 100644 src/assets/tinymce/skins/content/writer/content.min.css create mode 100644 src/assets/tinymce/skins/content/writer/content.min.css.map create mode 100644 src/assets/tinymce/skins/ui/oxide-dark/content.css create mode 100644 src/assets/tinymce/skins/ui/oxide-dark/content.inline.css create mode 100644 src/assets/tinymce/skins/ui/oxide-dark/content.inline.min.css create mode 100644 src/assets/tinymce/skins/ui/oxide-dark/content.inline.min.css.map create mode 100644 src/assets/tinymce/skins/ui/oxide-dark/content.min.css create mode 100644 src/assets/tinymce/skins/ui/oxide-dark/content.min.css.map create mode 100644 src/assets/tinymce/skins/ui/oxide-dark/content.mobile.css create mode 100644 src/assets/tinymce/skins/ui/oxide-dark/content.mobile.min.css create mode 100644 src/assets/tinymce/skins/ui/oxide-dark/content.mobile.min.css.map create mode 100644 src/assets/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff create mode 100644 src/assets/tinymce/skins/ui/oxide-dark/skin.css create mode 100644 src/assets/tinymce/skins/ui/oxide-dark/skin.min.css create mode 100644 src/assets/tinymce/skins/ui/oxide-dark/skin.min.css.map create mode 100644 src/assets/tinymce/skins/ui/oxide-dark/skin.mobile.css create mode 100644 src/assets/tinymce/skins/ui/oxide-dark/skin.mobile.min.css create mode 100644 src/assets/tinymce/skins/ui/oxide-dark/skin.mobile.min.css.map create mode 100644 src/assets/tinymce/skins/ui/oxide-dark/skin.shadowdom.css create mode 100644 src/assets/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css create mode 100644 src/assets/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css.map create mode 100644 src/assets/tinymce/skins/ui/oxide/content.css create mode 100644 src/assets/tinymce/skins/ui/oxide/content.inline.css create mode 100644 src/assets/tinymce/skins/ui/oxide/content.inline.min.css create mode 100644 src/assets/tinymce/skins/ui/oxide/content.inline.min.css.map create mode 100644 src/assets/tinymce/skins/ui/oxide/content.min.css create mode 100644 src/assets/tinymce/skins/ui/oxide/content.min.css.map create mode 100644 src/assets/tinymce/skins/ui/oxide/content.mobile.css create mode 100644 src/assets/tinymce/skins/ui/oxide/content.mobile.min.css create mode 100644 src/assets/tinymce/skins/ui/oxide/content.mobile.min.css.map create mode 100644 src/assets/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff create mode 100644 src/assets/tinymce/skins/ui/oxide/skin.css create mode 100644 src/assets/tinymce/skins/ui/oxide/skin.min.css create mode 100644 src/assets/tinymce/skins/ui/oxide/skin.min.css.map create mode 100644 src/assets/tinymce/skins/ui/oxide/skin.mobile.css create mode 100644 src/assets/tinymce/skins/ui/oxide/skin.mobile.min.css create mode 100644 src/assets/tinymce/skins/ui/oxide/skin.mobile.min.css.map create mode 100644 src/assets/tinymce/skins/ui/oxide/skin.shadowdom.css create mode 100644 src/assets/tinymce/skins/ui/oxide/skin.shadowdom.min.css create mode 100644 src/assets/tinymce/skins/ui/oxide/skin.shadowdom.min.css.map create mode 100644 src/assets/tinymce/themes/mobile/theme.js create mode 100644 src/assets/tinymce/themes/mobile/theme.min.js create mode 100644 src/assets/tinymce/themes/silver/theme.js create mode 100644 src/assets/tinymce/themes/silver/theme.min.js create mode 100644 src/assets/tinymce/tinymce.d.ts create mode 100644 src/assets/tinymce/tinymce.js create mode 100644 src/assets/tinymce/tinymce.min.js diff --git a/src/app/routes/sys-setting/components/agreement-config/agreement-config.component.html b/src/app/routes/sys-setting/components/agreement-config/agreement-config.component.html new file mode 100644 index 00000000..9f03cefa --- /dev/null +++ b/src/app/routes/sys-setting/components/agreement-config/agreement-config.component.html @@ -0,0 +1,39 @@ + + + +
+
+
    +
  • + {{ item.name }} +
  • +
+
+
+ +
+ {{ tabItem.typeName }} + +
+
+ 更新时间: {{ tabItem.modifyTime }} + 预览 + +
+
+
+ + +
+
+ +
+
+
+ + +
+
+
+
+
\ No newline at end of file diff --git a/src/app/routes/sys-setting/components/agreement-config/agreement-config.component.less b/src/app/routes/sys-setting/components/agreement-config/agreement-config.component.less new file mode 100644 index 00000000..0e059770 --- /dev/null +++ b/src/app/routes/sys-setting/components/agreement-config/agreement-config.component.less @@ -0,0 +1,90 @@ +:host { + // [nz-menu] { + // float: left; + // width: 254px; + // min-height: 810px; + // } + ::ng-deep { + .ant-menu-inline > .ant-menu-submenu > .ant-menu-submenu-title { + font-weight: 500; + } + + .ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected { + // background: transparent; + } + .ant-menu-inline .ant-menu-item::after { + border-right: none; + } + .ant-menu-item-selected { + background: transparent; + } + .ant-menu-inline .ant-menu-submenu-title { + margin: 0; + } + .console-menu-icon { + width: 20px; + } + .console-menu-title { + margin-left: 9px; + vertical-align: middle; + } + .ant-menu-item:focus { + outline: none !important; + } + .tabset-container { + height: 450px; + margin-top: 16px; + overflow-y: auto; + } + } + h3 { + margin-left: 15px; + padding: 8px 15px; + font-weight: 700; + } + .times { + display: inline-block; + padding-right: 15px; + } + .width100 { + width: 100px; + margin: 0 5px; + } + .width200 { + width: 200px; + margin: 0 5px; + } + .sales-order { + margin-left: 15px; + padding: 8px 40px; + font-size: 18px; + } + .general-box { + height: 750px; + overflow: auto; + } + .card-height { + height: 800px; + } + .btn-right { + float: right; + } + .save-btn { + width: 100%; + text-align: right; + } + .ant-menu-vertical .ant-menu-item::after, + .ant-menu-vertical-left .ant-menu-item::after, + .ant-menu-vertical-right .ant-menu-item::after, + .ant-menu-inline .ant-menu-item::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + border-right: 3px solid #202886; + content: ''; + } + .but_rigth { + margin-left: 16% !important; + } +} diff --git a/src/app/routes/sys-setting/components/agreement-config/agreement-config.component.ts b/src/app/routes/sys-setting/components/agreement-config/agreement-config.component.ts new file mode 100644 index 00000000..55272c75 --- /dev/null +++ b/src/app/routes/sys-setting/components/agreement-config/agreement-config.component.ts @@ -0,0 +1,125 @@ +import { DatePipe } from '@angular/common'; +import { Component, OnInit, TemplateRef, ViewChild } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { SFComponent, SFSchema, SFUISchema, SFUploadWidgetSchema } from '@delon/form'; +import { _HttpClient } from '@delon/theme'; +import { Observable, Observer } from 'rxjs'; +import { Router } from '@angular/router'; +import { SystemService } from '../../services/system.service'; +import { EnvironmentService } from '@env/environment.service'; +@Component({ + selector: 'app-agreement-config-components-base', + styleUrls: ['./agreement-config.component.less'], + templateUrl: './agreement-config.component.html' +}) +export class AgreementConfigComponentsBaseComponent implements OnInit { + @ViewChild('sf1', { static: false }) sf1!: SFComponent; + + i: any; + formDate: any = {}; + schema1!: SFSchema; + ui1: SFUISchema = {}; + idx: any = 0; + isUpdate = false; + type = 0; + tabItem = { + content: '', + id: 0, + modifyTime: '', + type: '', + typeName: '' + }; + tabs = [ + { + name: '《货主端用户注册协议》' + }, + { + name: '《司机端用户注册协议》' + }, + { + name: '《服务协议》' + }, + { + name: '《隐私政策》' + }, + { + name: '《人脸识别协议》' + } + ]; + + constructor(private service: SystemService) {} + + ngOnInit() { + this.loadAgreement(); + this.initSF(); + } + initSF() { + this.schema1 = { + properties: { + content: { + type: 'string', + title: '', + ui: { + widget: 'tinymce', + loadingTip: 'loading...', + config: { + height: 650 + } + } + } + } + }; + this.ui1 = { + '*': { + spanLabelFixed: 10, + grid: { span: 24 } + } + }; + } + + changeType(type: number): void { + this.idx = type; + if (type > 0) { + this.isUpdate = false; + this.type = +type; + + this.loadAgreement(); + } + } + + loadAgreement() { + // this.service.request(`${this.service.$api_general_getAgreement}`, { type: this.type }).subscribe((res) => { + // console.log('🚀 ~ this.service.request ~ res', res); + // if (res) { + // this.tabItem = res; + // } + // }); + } + + update() { + this.isUpdate = true; + console.log('🚀 ~ update ~ isUpdate', this.tabItem); + + this.formDate.content = this.tabItem.content; + this.initSF(); + } + save() { + const params = { + id: this.tabItem.id, + content: encodeURIComponent(this.sf1?.value.content), + type: this.type + }; + this.isUpdate = false; + // this.service.request(`${this.service.$api_general_updateAgreement}`, params).subscribe((res) => { + // if (res) { + // this.service.msgSrv.success('保存成功'); + // this.changeType(this.type); + // this.isUpdate = false; + // } + // }); + } + + cancel() { + this.isUpdate = false; + } +} diff --git a/src/app/routes/sys-setting/sys-setting-routing.module.ts b/src/app/routes/sys-setting/sys-setting-routing.module.ts index fda7ba9b..0a484aa6 100644 --- a/src/app/routes/sys-setting/sys-setting-routing.module.ts +++ b/src/app/routes/sys-setting/sys-setting-routing.module.ts @@ -1,5 +1,6 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; +import { AgreementConfigComponentsBaseComponent } from './components/agreement-config/agreement-config.component'; import { AuditReasonConfigComponent } from './components/audit-reason-config/audit-reason-config.component'; import { BasicConfigComponent } from './components/basic-config/basic-config.component'; import { CartConfigComponent } from './components/cart-config/cart-config.component'; @@ -18,6 +19,7 @@ const routes: Routes = [ { path: 'version-logs', component: VersionLogsComponent }, { path: 'audit-reason-config', component: AuditReasonConfigComponent }, { path: 'cart-config', component: CartConfigComponent }, + { path: 'agreement-config', component: AgreementConfigComponentsBaseComponent }, ]; @NgModule({ diff --git a/src/app/routes/sys-setting/sys-setting.module.ts b/src/app/routes/sys-setting/sys-setting.module.ts index 41134a02..fa314014 100644 --- a/src/app/routes/sys-setting/sys-setting.module.ts +++ b/src/app/routes/sys-setting/sys-setting.module.ts @@ -15,6 +15,7 @@ import { BasicConfigActionModalComponent } from './components/basic-config/basic import { AuditResonConfigActionModalComponent } from './components/audit-reason-config/audit-reson-config-action-modal/audit-reson-config-action-modal.component'; import { CartConfigComponent } from './components/cart-config/cart-config.component'; import { CartConfigActionModalComponent } from './components/cart-config/cart-config-action-modal/cart-config-action-modal.component'; +import { AgreementConfigComponentsBaseComponent } from './components/agreement-config/agreement-config.component'; const COMPONENTS = [ StaffManagementComponent, @@ -24,7 +25,8 @@ const COMPONENTS = [ UserLogsComponent, VersionLogsComponent, AuditReasonConfigComponent, - CartConfigComponent + CartConfigComponent, + AgreementConfigComponentsBaseComponent ]; const NOTROUTECOMPONENTS = [ BuyerTranspowerComponent, diff --git a/src/app/shared/index.ts b/src/app/shared/index.ts index 7b37910b..c43ab4b2 100644 --- a/src/app/shared/index.ts +++ b/src/app/shared/index.ts @@ -22,3 +22,7 @@ export * from './utils/yuan'; // Module export * from './shared.module'; +export * from './shared-delon.module'; +export * from './shared-zorro.module'; +export * from './shared-third.module'; +export * from './widget/st-widget.module'; diff --git a/src/app/shared/shared-third.module.ts b/src/app/shared/shared-third.module.ts new file mode 100644 index 00000000..a5a9614d --- /dev/null +++ b/src/app/shared/shared-third.module.ts @@ -0,0 +1,33 @@ +import { DragDropModule } from '@angular/cdk/drag-drop'; +import { ScrollingModule } from '@angular/cdk/scrolling'; +import { NgModule } from '@angular/core'; +import { apiConf } from '@conf/api.conf'; +import { NgxTinymceModule } from 'ngx-tinymce'; +import { environment } from '@env/environment'; +import { AbmModule } from 'angular-baidu-maps'; + +const TinyMce = NgxTinymceModule.forRoot({ + baseURL: 'assets/tinymce/', + config: { + language_url: 'assets/tinymce/langs/zh_CN.js', + language: 'zh_CN', + plugins: [ + 'advlist autolink lists link image charmap print preview anchor', + 'searchreplace visualblocks code fullscreen', + 'insertdatetime media table paste imagetools wordcount' + ], + toolbar: + 'insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image', + content_style: 'body { font-family:Helvetica,Arial,sans-serif; font-size:14px }' + } +}); + +const SHARED_THIRD_MODULES = [DragDropModule, ScrollingModule]; + +@NgModule({ + declarations: [], + entryComponents: [], + imports: [...SHARED_THIRD_MODULES, TinyMce, AbmModule.forRoot({ apiKey: '8oZDc2QBZSbjNpoC42cd5jGVa3GknG1c' })], + exports: [...SHARED_THIRD_MODULES, NgxTinymceModule] +}) +export class SharedThirdModule {} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 413d5ad0..b14ffe68 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -25,6 +25,7 @@ import { MasonryModule } from './components/masonry'; import { MouseFocusModule } from './components/mouse-focus'; import { ScrollbarModule } from './components/scrollbar'; import { StatusLabelModule } from './components/status-label'; +import { SharedThirdModule } from './shared-third.module'; const MODULES = [ AddressModule, @@ -35,6 +36,7 @@ const MODULES = [ MouseFocusModule, ScrollbarModule, StatusLabelModule, + SharedThirdModule, ...PRO_SHARED_MODULES ]; // #endregion diff --git a/src/app/shared/widget/st-widget.module.ts b/src/app/shared/widget/st-widget.module.ts index 827fd14f..402f66ec 100644 --- a/src/app/shared/widget/st-widget.module.ts +++ b/src/app/shared/widget/st-widget.module.ts @@ -2,7 +2,7 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { STWidgetRegistry } from '@delon/abc/st'; -import { DelonFormModule } from '@delon/form'; +import { DelonFormModule, WidgetRegistry } from '@delon/form'; import { AddressModule, EditorModule, FileManagerModule } from '@shared'; import { NzButtonModule } from 'ng-zorro-antd/button'; import { NzDatePickerModule } from 'ng-zorro-antd/date-picker'; @@ -58,7 +58,7 @@ export const STWIDGET_COMPONENTS = [ entryComponents: STWIDGET_COMPONENTS }) export class STWidgetModule { - constructor(widgetRegistry: STWidgetRegistry) { + constructor(widgetRegistry: WidgetRegistry) { widgetRegistry.register(EditorWidget.KEY, EditorWidget); widgetRegistry.register(ImgWidget.KEY, ImgWidget); widgetRegistry.register(AddressWidget.KEY, AddressWidget); diff --git a/src/assets/mocks/menu-data.json b/src/assets/mocks/menu-data.json index d7efcf70..a3d20abe 100644 --- a/src/assets/mocks/menu-data.json +++ b/src/assets/mocks/menu-data.json @@ -129,7 +129,7 @@ }, { "text": "协议配置", - "link": "/system/alain" + "link": "/system/agreement-config" }, { "text": "审核驳回理由配置", diff --git a/src/assets/tinymce/icons/default/icons.js b/src/assets/tinymce/icons/default/icons.js new file mode 100644 index 00000000..d31c9072 --- /dev/null +++ b/src/assets/tinymce/icons/default/icons.js @@ -0,0 +1,172 @@ +tinymce.IconManager.add('default', { + icons: { + 'accessibility-check': '', + 'action-next': '', + 'action-prev': '', + 'align-center': '', + 'align-justify': '', + 'align-left': '', + 'align-none': '', + 'align-right': '', + 'arrow-left': '', + 'arrow-right': '', + 'bold': '', + 'bookmark': '', + 'border-width': '', + 'brightness': '', + 'browse': '', + 'cancel': '', + 'change-case': '', + 'character-count': '', + 'checklist-rtl': '', + 'checklist': '', + 'checkmark': '', + 'chevron-down': '', + 'chevron-left': '', + 'chevron-right': '', + 'chevron-up': '', + 'close': '', + 'code-sample': '', + 'color-levels': '', + 'color-picker': '', + 'color-swatch-remove-color': '', + 'color-swatch': '', + 'comment-add': '', + 'comment': '', + 'contrast': '', + 'copy': '', + 'crop': '', + 'cut-column': '', + 'cut-row': '', + 'cut': '', + 'document-properties': '', + 'drag': '', + 'duplicate-column': '', + 'duplicate-row': '', + 'duplicate': '', + 'edit-block': '', + 'edit-image': '', + 'embed-page': '', + 'embed': '', + 'emoji': '', + 'export': '', + 'fill': '', + 'flip-horizontally': '', + 'flip-vertically': '', + 'format-painter': '', + 'format': '', + 'fullscreen': '', + 'gallery': '', + 'gamma': '', + 'help': '', + 'highlight-bg-color': '', + 'home': '', + 'horizontal-rule': '', + 'image-options': '', + 'image': '', + 'indent': '', + 'info': '', + 'insert-character': '', + 'insert-time': '', + 'invert': '', + 'italic': '', + 'line-height': '', + 'line': '', + 'link': '', + 'list-bull-circle': '', + 'list-bull-default': '', + 'list-bull-square': '', + 'list-num-default-rtl': '', + 'list-num-default': '', + 'list-num-lower-alpha-rtl': '', + 'list-num-lower-alpha': '', + 'list-num-lower-greek-rtl': '', + 'list-num-lower-greek': '', + 'list-num-lower-roman-rtl': '', + 'list-num-lower-roman': '', + 'list-num-upper-alpha-rtl': '', + 'list-num-upper-alpha': '', + 'list-num-upper-roman-rtl': '', + 'list-num-upper-roman': '', + 'lock': '', + 'ltr': '', + 'more-drawer': '', + 'new-document': '', + 'new-tab': '', + 'non-breaking': '', + 'notice': '', + 'ordered-list-rtl': '', + 'ordered-list': '', + 'orientation': '', + 'outdent': '', + 'page-break': '', + 'paragraph': '', + 'paste-column-after': '', + 'paste-column-before': '', + 'paste-row-after': '', + 'paste-row-before': '', + 'paste-text': '', + 'paste': '', + 'permanent-pen': '', + 'plus': '', + 'preferences': '', + 'preview': '', + 'print': '', + 'quote': '', + 'redo': '', + 'reload': '', + 'remove-formatting': '', + 'remove': '', + 'resize-handle': '', + 'resize': '', + 'restore-draft': '', + 'rotate-left': '', + 'rotate-right': '', + 'rtl': '', + 'save': '', + 'search': '', + 'select-all': '', + 'selected': '', + 'settings': '', + 'sharpen': '', + 'sourcecode': '', + 'spell-check': '', + 'strike-through': '', + 'subscript': '', + 'superscript': '', + 'table-cell-properties': '', + 'table-cell-select-all': '', + 'table-cell-select-inner': '', + 'table-delete-column': '', + 'table-delete-row': '', + 'table-delete-table': '', + 'table-insert-column-after': '', + 'table-insert-column-before': '', + 'table-insert-row-above': '', + 'table-insert-row-after': '', + 'table-left-header': '', + 'table-merge-cells': '', + 'table-row-properties': '', + 'table-split-cells': '', + 'table-top-header': '', + 'table': '', + 'template': '', + 'temporary-placeholder': '', + 'text-color': '', + 'toc': '', + 'translate': '', + 'underline': '', + 'undo': '', + 'unlink': '', + 'unlock': '', + 'unordered-list': '', + 'unselected': '', + 'upload': '', + 'user': '', + 'visualblocks': '', + 'visualchars': '', + 'warning': '', + 'zoom-in': '', + 'zoom-out': '', + } +}); \ No newline at end of file diff --git a/src/assets/tinymce/icons/default/icons.min.js b/src/assets/tinymce/icons/default/icons.min.js new file mode 100644 index 00000000..086f297d --- /dev/null +++ b/src/assets/tinymce/icons/default/icons.min.js @@ -0,0 +1 @@ +tinymce.IconManager.add("default",{icons:{"accessibility-check":'',"action-next":'',"action-prev":'',"align-center":'',"align-justify":'',"align-left":'',"align-none":'',"align-right":'',"arrow-left":'',"arrow-right":'',bold:'',bookmark:'',"border-width":'',brightness:'',browse:'',cancel:'',"change-case":'',"character-count":'',"checklist-rtl":'',checklist:'',checkmark:'',"chevron-down":'',"chevron-left":'',"chevron-right":'',"chevron-up":'',close:'',"code-sample":'',"color-levels":'',"color-picker":'',"color-swatch-remove-color":'',"color-swatch":'',"comment-add":'',comment:'',contrast:'',copy:'',crop:'',"cut-column":'',"cut-row":'',cut:'',"document-properties":'',drag:'',"duplicate-column":'',"duplicate-row":'',duplicate:'',"edit-block":'',"edit-image":'',"embed-page":'',embed:'',emoji:'',"export":'',fill:'',"flip-horizontally":'',"flip-vertically":'',"format-painter":'',format:'',fullscreen:'',gallery:'',gamma:'',help:'',"highlight-bg-color":'',home:'',"horizontal-rule":'',"image-options":'',image:'',indent:'',info:'',"insert-character":'',"insert-time":'',invert:'',italic:'',"line-height":'',line:'',link:'',"list-bull-circle":'',"list-bull-default":'',"list-bull-square":'',"list-num-default-rtl":'',"list-num-default":'',"list-num-lower-alpha-rtl":'',"list-num-lower-alpha":'',"list-num-lower-greek-rtl":'',"list-num-lower-greek":'',"list-num-lower-roman-rtl":'',"list-num-lower-roman":'',"list-num-upper-alpha-rtl":'',"list-num-upper-alpha":'',"list-num-upper-roman-rtl":'',"list-num-upper-roman":'',lock:'',ltr:'',"more-drawer":'',"new-document":'',"new-tab":'',"non-breaking":'',notice:'',"ordered-list-rtl":'',"ordered-list":'',orientation:'',outdent:'',"page-break":'',paragraph:'',"paste-column-after":'',"paste-column-before":'',"paste-row-after":'',"paste-row-before":'',"paste-text":'',paste:'',"permanent-pen":'',plus:'',preferences:'',preview:'',print:'',quote:'',redo:'',reload:'',"remove-formatting":'',remove:'',"resize-handle":'',resize:'',"restore-draft":'',"rotate-left":'',"rotate-right":'',rtl:'',save:'',search:'',"select-all":'',selected:'',settings:'',sharpen:'',sourcecode:'',"spell-check":'',"strike-through":'',subscript:'',superscript:'',"table-cell-properties":'',"table-cell-select-all":'',"table-cell-select-inner":'',"table-delete-column":'',"table-delete-row":'',"table-delete-table":'',"table-insert-column-after":'',"table-insert-column-before":'',"table-insert-row-above":'',"table-insert-row-after":'',"table-left-header":'',"table-merge-cells":'',"table-row-properties":'',"table-split-cells":'',"table-top-header":'',table:'',template:'',"temporary-placeholder":'',"text-color":'',toc:'',translate:'',underline:'',undo:'',unlink:'',unlock:'',"unordered-list":'',unselected:'',upload:'',user:'',visualblocks:'',visualchars:'',warning:'',"zoom-in":'',"zoom-out":''}}); \ No newline at end of file diff --git a/src/assets/tinymce/jquery.tinymce.min.js b/src/assets/tinymce/jquery.tinymce.min.js new file mode 100644 index 00000000..4dbd28d8 --- /dev/null +++ b/src/assets/tinymce/jquery.tinymce.min.js @@ -0,0 +1,92 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +/** + * Jquery integration plugin. + * + * @class tinymce.core.JqueryIntegration + * @private + */ +!function(){var f,c,u,s=[],p="undefined"!=typeof global?global:window,d=p.jQuery,v=function(){ +// Reference to tinymce needs to be lazily evaluated since tinymce +// might be loaded through the compressor or other means +return p.tinymce};d.fn.tinymce=function(o){var e,t,i,l=this,r=""; +// No match then just ignore the call +if(!l.length)return l; +// Get editor instance +if(!o)return v()?v().get(l[0].id):null;l.css("visibility","hidden");// Hide textarea to avoid flicker +var n,a=function(){var a=[],c=0; +// Apply patches to the jQuery object, only once +u||(m(),u=!0), +// Create an editor instance for each matched node +l.each(function(e,t){var n,i=t.id,r=o.oninit; +// Generate unique id for target element if needed +i||(t.id=i=v().DOM.uniqueId()), +// Only init the editor once +v().get(i)||( +// Create editor instance and render it +n=v().createEditor(i,o),a.push(n),n.on("init",function(){var e,t=r;l.css("visibility",""), +// Run this if the oninit setting is defined +// this logic will fire the oninit callback ones each +// matched editor instance is initialized +r&&++c==a.length&&("string"==typeof t&&(e=-1===t.indexOf(".")?null:v().resolve(t.replace(/\.\w+$/,"")),t=v().resolve(t)), +// Call the oninit function with the object +t.apply(e||v(),a))}))}), +// Render the editor instances in a separate loop since we +// need to have the full editors array used in the onInit calls +d.each(a,function(e,t){t.render()})}; +// Load TinyMCE on demand, if we need to +return p.tinymce||c||!(e=o.script_url)? +// Delay the init call until tinymce is loaded +1===c?s.push(a):a():(c=1,t=e.substring(0,e.lastIndexOf("/")), +// Check if it's a dev/src version they want to load then +// make sure that all plugins, themes etc are loaded in source modal as well +-1!=e.indexOf(".min")&&(r=".min"), +// Setup tinyMCEPreInit object this will later be used by the TinyMCE +// core script to locate other resources like CSS files, dialogs etc +// You can also predefined a tinyMCEPreInit object and then it will use that instead +p.tinymce=p.tinyMCEPreInit||{base:t,suffix:r}, +// url contains gzip then we assume it's a compressor +-1!=e.indexOf("gzip")&&(i=o.language||"en",e=e+(/\?/.test(e)?"&":"?")+"js=true&core=true&suffix="+escape(r)+"&themes="+escape(o.theme||"modern")+"&plugins="+escape(o.plugins||"")+"&languages="+(i||""), +// Check if compressor script is already loaded otherwise setup a basic one +p.tinyMCE_GZ||(p.tinyMCE_GZ={start:function(){var n=function(e){v().ScriptLoader.markDone(v().baseURI.toAbsolute(e))}; +// Add core languages +n("langs/"+i+".js"), +// Add themes with languages +n("themes/"+o.theme+"/theme"+r+".js"),n("themes/"+o.theme+"/langs/"+i+".js"), +// Add plugins with languages +d.each(o.plugins.split(","),function(e,t){t&&(n("plugins/"+t+"/plugin"+r+".js"),n("plugins/"+t+"/langs/"+i+".js"))})},end:function(){}})),(n=document.createElement("script")).type="text/javascript",n.onload=n.onreadystatechange=function(e){e=e||window.event,2===c||"load"!=e.type&&!/complete|loaded/.test(n.readyState)||(v().dom.Event.domLoaded=1,c=2, +// Execute callback after mainscript has been loaded and before the initialization occurs +o.script_loaded&&o.script_loaded(),a(),d.each(s,function(e,t){t()}))},n.src=e,document.body.appendChild(n)),l}, +// Add :tinymce pseudo selector this will select elements that has been converted into editor instances +// it's now possible to use things like $('*:tinymce') to get all TinyMCE bound elements. +d.extend(d.expr[":"],{tinymce:function(e){var t;return!!(e.id&&"tinymce"in p&&(t=v().get(e.id))&&t.editorManager===v())}}); +// This function patches internal jQuery functions so that if +// you for example remove an div element containing an editor it's +// automatically destroyed by the TinyMCE API +var m=function(){ +// Removes any child editor instances by looking for editor wrapper elements +var r=function(e){ +// If the function is remove +"remove"===e&&this.each(function(e,t){var n=l(t);n&&n.remove()}),this.find("span.mceEditor,div.mceEditor").each(function(e,t){var n=v().get(t.id.replace(/_parent$/,""));n&&n.remove()})},o=function(i){var e,t=this; +// Handle set value +/*jshint eqnull:true */if(null!=i)r.call(t), +// Saves the contents before get/set value of textarea/div +t.each(function(e,t){var n;(n=v().get(t.id))&&n.setContent(i)});else if(0])*>/g,""):n.getContent({save:!0}):a.apply(d(t),r)}),i}}), +// Makes it possible to use $('#id').append("content"); to append contents to the TinyMCE editor iframe +d.each(["append","prepend"],function(e,t){var n=s[t]=d.fn[t],r="prepend"===t;d.fn[t]=function(i){var e=this;return u(e)?i!==f?("string"==typeof i&&e.filter(":tinymce").each(function(e,t){var n=l(t);n&&n.setContent(r?i+n.getContent():n.getContent()+i)}),n.apply(e.not(":tinymce"),arguments),e):void 0:n.apply(e,arguments)}}), +// Makes sure that the editor instance gets properly destroyed when the parent element is removed +d.each(["remove","replaceWith","replaceAll","empty"],function(e,t){var n=s[t]=d.fn[t];d.fn[t]=function(){return r.call(this,t),n.apply(this,arguments)}}),s.attr=d.fn.attr, +// Makes sure that $('#tinymce_id').attr('value') gets the editors current HTML contents +d.fn.attr=function(e,t){var n=this,i=arguments;if(!e||"value"!==e||!u(n))return s.attr.apply(n,i);if(t!==f)return o.call(n.filter(":tinymce"),t),s.attr.apply(n.not(":tinymce"),i),n;// return original set for chaining +var r=n[0],a=l(r);return a?a.getContent({save:!0}):s.attr.apply(d(r),i)}}}(); diff --git a/src/assets/tinymce/langs/readme.md b/src/assets/tinymce/langs/readme.md new file mode 100644 index 00000000..a52bf03f --- /dev/null +++ b/src/assets/tinymce/langs/readme.md @@ -0,0 +1,3 @@ +This is where language files should be placed. + +Please DO NOT translate these directly use this service: https://www.transifex.com/projects/p/tinymce/ diff --git a/src/assets/tinymce/langs/zh_CN.js b/src/assets/tinymce/langs/zh_CN.js new file mode 100644 index 00000000..0f3cf923 --- /dev/null +++ b/src/assets/tinymce/langs/zh_CN.js @@ -0,0 +1,261 @@ +tinymce.addI18n('zh_CN',{ +"Redo": "\u91cd\u590d", +"Undo": "\u64a4\u6d88", +"Cut": "\u526a\u5207", +"Copy": "\u590d\u5236", +"Paste": "\u7c98\u8d34", +"Select all": "\u5168\u9009", +"New document": "\u65b0\u6587\u6863", +"Ok": "\u786e\u5b9a", +"Cancel": "\u53d6\u6d88", +"Visual aids": "\u7f51\u683c\u7ebf", +"Bold": "\u7c97\u4f53", +"Italic": "\u659c\u4f53", +"Underline": "\u4e0b\u5212\u7ebf", +"Strikethrough": "\u5220\u9664\u7ebf", +"Superscript": "\u4e0a\u6807", +"Subscript": "\u4e0b\u6807", +"Clear formatting": "\u6e05\u9664\u683c\u5f0f", +"Align left": "\u5de6\u5bf9\u9f50", +"Align center": "\u5c45\u4e2d", +"Align right": "\u53f3\u5bf9\u9f50", +"Justify": "\u4e24\u7aef\u5bf9\u9f50", +"Bullet list": "\u9879\u76ee\u7b26\u53f7", +"Numbered list": "\u7f16\u53f7\u5217\u8868", +"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb", +"Increase indent": "\u589e\u52a0\u7f29\u8fdb", +"Close": "\u5173\u95ed", +"Formats": "\u683c\u5f0f", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u5bf9\u526a\u8d34\u677f\u7684\u8bbf\u95ee\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u952e\u8fdb\u884c\u590d\u5236\u7c98\u8d34\u3002", +"Headers": "\u6807\u9898", +"Header 1": "\u6807\u98981", +"Header 2": "\u6807\u98982", +"Header 3": "\u6807\u98983", +"Header 4": "\u6807\u98984", +"Header 5": "\u6807\u98985", +"Header 6": "\u6807\u98986", +"Headings": "\u6807\u9898", +"Heading 1": "\u6807\u98981", +"Heading 2": "\u6807\u98982", +"Heading 3": "\u6807\u98983", +"Heading 4": "\u6807\u98984", +"Heading 5": "\u6807\u98985", +"Heading 6": "\u6807\u98986", +"Preformatted": "\u9884\u683c\u5f0f\u5316", +"Div": "Div\u533a\u5757", +"Pre": "\u9884\u683c\u5f0f\u6587\u672c", +"Code": "\u4ee3\u7801", +"Paragraph": "\u6bb5\u843d", +"Blockquote": "\u5f15\u7528", +"Inline": "\u6587\u672c", +"Blocks": "\u533a\u5757", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002", +"Font Family": "\u5b57\u4f53", +"Font Sizes": "\u5b57\u53f7", +"Class": "Class", +"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf", +"OR": "\u6216", +"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64", +"Upload": "\u4e0a\u4f20", +"Block": "\u5757", +"Align": "\u5bf9\u9f50", +"Default": "\u9ed8\u8ba4", +"Circle": "\u7a7a\u5fc3\u5706", +"Disc": "\u5b9e\u5fc3\u5706", +"Square": "\u65b9\u5757", +"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd", +"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd", +"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd", +"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Anchor": "\u951a\u70b9", +"Name": "\u540d\u79f0", +"Id": "\u6807\u8bc6\u7b26", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002", +"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f", +"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f", +"Special character": "\u7279\u6b8a\u7b26\u53f7", +"Source code": "\u6e90\u4ee3\u7801", +"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b", +"Language": "\u8bed\u8a00", +"Code sample": "\u4ee3\u7801\u793a\u4f8b", +"Color": "\u989c\u8272", +"R": "R", +"G": "G", +"B": "B", +"Left to right": "\u4ece\u5de6\u5230\u53f3", +"Right to left": "\u4ece\u53f3\u5230\u5de6", +"Emoticons": "\u8868\u60c5", +"Document properties": "\u6587\u6863\u5c5e\u6027", +"Title": "\u6807\u9898", +"Keywords": "\u5173\u952e\u8bcd", +"Description": "\u63cf\u8ff0", +"Robots": "\u673a\u5668\u4eba", +"Author": "\u4f5c\u8005", +"Encoding": "\u7f16\u7801", +"Fullscreen": "\u5168\u5c4f", +"Action": "\u64cd\u4f5c", +"Shortcut": "\u5feb\u6377\u952e", +"Help": "\u5e2e\u52a9", +"Address": "\u5730\u5740", +"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f", +"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f", +"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84", +"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355", +"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):", +"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a", +"Learn more...": "\u4e86\u89e3\u66f4\u591a...", +"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}", +"Plugins": "\u63d2\u4ef6", +"Handy Shortcuts": "\u5feb\u6377\u952e", +"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf", +"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247", +"Image description": "\u56fe\u7247\u63cf\u8ff0", +"Source": "\u5730\u5740", +"Dimensions": "\u5927\u5c0f", +"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4", +"General": "\u666e\u901a", +"Advanced": "\u9ad8\u7ea7", +"Style": "\u6837\u5f0f", +"Vertical space": "\u5782\u76f4\u8fb9\u8ddd", +"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd", +"Border": "\u8fb9\u6846", +"Insert image": "\u63d2\u5165\u56fe\u7247", +"Image": "\u56fe\u7247", +"Image list": "\u56fe\u7247\u5217\u8868", +"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c", +"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c", +"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c", +"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c", +"Edit image": "\u7f16\u8f91\u56fe\u7247", +"Image options": "\u56fe\u7247\u9009\u9879", +"Zoom in": "\u653e\u5927", +"Zoom out": "\u7f29\u5c0f", +"Crop": "\u88c1\u526a", +"Resize": "\u8c03\u6574\u5927\u5c0f", +"Orientation": "\u65b9\u5411", +"Brightness": "\u4eae\u5ea6", +"Sharpen": "\u9510\u5316", +"Contrast": "\u5bf9\u6bd4\u5ea6", +"Color levels": "\u989c\u8272\u5c42\u6b21", +"Gamma": "\u4f3d\u9a6c\u503c", +"Invert": "\u53cd\u8f6c", +"Apply": "\u5e94\u7528", +"Back": "\u540e\u9000", +"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4", +"Date\/time": "\u65e5\u671f\/\u65f6\u95f4", +"Insert link": "\u63d2\u5165\u94fe\u63a5", +"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", +"Text to display": "\u663e\u793a\u6587\u5b57", +"Url": "\u5730\u5740", +"Target": "\u6253\u5f00\u65b9\u5f0f", +"None": "\u65e0", +"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00", +"Remove link": "\u5220\u9664\u94fe\u63a5", +"Anchors": "\u951a\u70b9", +"Link": "\u94fe\u63a5", +"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f", +"Link list": "\u94fe\u63a5\u5217\u8868", +"Insert video": "\u63d2\u5165\u89c6\u9891", +"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891", +"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53", +"Alternative source": "\u955c\u50cf", +"Poster": "\u5c01\u9762", +"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:", +"Embed": "\u5185\u5d4c", +"Media": "\u5a92\u4f53", +"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c", +"Page break": "\u5206\u9875\u7b26", +"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c", +"Preview": "\u9884\u89c8", +"Print": "\u6253\u5370", +"Save": "\u4fdd\u5b58", +"Find": "\u67e5\u627e", +"Replace with": "\u66ff\u6362\u4e3a", +"Replace": "\u66ff\u6362", +"Replace all": "\u5168\u90e8\u66ff\u6362", +"Prev": "\u4e0a\u4e00\u4e2a", +"Next": "\u4e0b\u4e00\u4e2a", +"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362", +"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.", +"Match case": "\u533a\u5206\u5927\u5c0f\u5199", +"Whole words": "\u5168\u5b57\u5339\u914d", +"Spellcheck": "\u62fc\u5199\u68c0\u67e5", +"Ignore": "\u5ffd\u7565", +"Ignore all": "\u5168\u90e8\u5ffd\u7565", +"Finish": "\u5b8c\u6210", +"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178", +"Insert table": "\u63d2\u5165\u8868\u683c", +"Table properties": "\u8868\u683c\u5c5e\u6027", +"Delete table": "\u5220\u9664\u8868\u683c", +"Cell": "\u5355\u5143\u683c", +"Row": "\u884c", +"Column": "\u5217", +"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027", +"Merge cells": "\u5408\u5e76\u5355\u5143\u683c", +"Split cell": "\u62c6\u5206\u5355\u5143\u683c", +"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165", +"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165", +"Delete row": "\u5220\u9664\u884c", +"Row properties": "\u884c\u5c5e\u6027", +"Cut row": "\u526a\u5207\u884c", +"Copy row": "\u590d\u5236\u884c", +"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9", +"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9", +"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165", +"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165", +"Delete column": "\u5220\u9664\u5217", +"Cols": "\u5217", +"Rows": "\u884c", +"Width": "\u5bbd", +"Height": "\u9ad8", +"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd", +"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd", +"Caption": "\u6807\u9898", +"Left": "\u5de6\u5bf9\u9f50", +"Center": "\u5c45\u4e2d", +"Right": "\u53f3\u5bf9\u9f50", +"Cell type": "\u5355\u5143\u683c\u7c7b\u578b", +"Scope": "\u8303\u56f4", +"Alignment": "\u5bf9\u9f50\u65b9\u5f0f", +"H Align": "\u6c34\u5e73\u5bf9\u9f50", +"V Align": "\u5782\u76f4\u5bf9\u9f50", +"Top": "\u9876\u90e8\u5bf9\u9f50", +"Middle": "\u5782\u76f4\u5c45\u4e2d", +"Bottom": "\u5e95\u90e8\u5bf9\u9f50", +"Header cell": "\u8868\u5934\u5355\u5143\u683c", +"Row group": "\u884c\u7ec4", +"Column group": "\u5217\u7ec4", +"Row type": "\u884c\u7c7b\u578b", +"Header": "\u8868\u5934", +"Body": "\u8868\u4f53", +"Footer": "\u8868\u5c3e", +"Border color": "\u8fb9\u6846\u989c\u8272", +"Insert template": "\u63d2\u5165\u6a21\u677f", +"Templates": "\u6a21\u677f", +"Template": "\u6a21\u677f", +"Text color": "\u6587\u5b57\u989c\u8272", +"Background color": "\u80cc\u666f\u8272", +"Custom...": "\u81ea\u5b9a\u4e49...", +"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272", +"No color": "\u65e0", +"Table of Contents": "\u5185\u5bb9\u5217\u8868", +"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846", +"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26", +"Words: {0}": "\u5b57\u6570\uff1a{0}", +"{0} words": "{0} \u5b57", +"File": "\u6587\u4ef6", +"Edit": "\u7f16\u8f91", +"Insert": "\u63d2\u5165", +"View": "\u89c6\u56fe", +"Format": "\u683c\u5f0f", +"Table": "\u8868\u683c", +"Tools": "\u5de5\u5177", +"Powered by {0}": "\u7531{0}\u9a71\u52a8", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9" +}); \ No newline at end of file diff --git a/src/assets/tinymce/license.txt b/src/assets/tinymce/license.txt new file mode 100644 index 00000000..b17fc904 --- /dev/null +++ b/src/assets/tinymce/license.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/src/assets/tinymce/plugins/advlist/plugin.js b/src/assets/tinymce/plugins/advlist/plugin.js new file mode 100644 index 00000000..0dd07b06 --- /dev/null +++ b/src/assets/tinymce/plugins/advlist/plugin.js @@ -0,0 +1,278 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var applyListFormat = function (editor, listName, styleValue) { + var cmd = listName === 'UL' ? 'InsertUnorderedList' : 'InsertOrderedList'; + editor.execCommand(cmd, false, styleValue === false ? null : { 'list-style-type': styleValue }); + }; + + var register = function (editor) { + editor.addCommand('ApplyUnorderedListStyle', function (ui, value) { + applyListFormat(editor, 'UL', value['list-style-type']); + }); + editor.addCommand('ApplyOrderedListStyle', function (ui, value) { + applyListFormat(editor, 'OL', value['list-style-type']); + }); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var getNumberStyles = function (editor) { + var styles = editor.getParam('advlist_number_styles', 'default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman'); + return styles ? styles.split(/[ ,]/) : []; + }; + var getBulletStyles = function (editor) { + var styles = editor.getParam('advlist_bullet_styles', 'default,circle,square'); + return styles ? styles.split(/[ ,]/) : []; + }; + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Optional = { + some: some, + none: none, + from: from + }; + + var isChildOfBody = function (editor, elm) { + return editor.$.contains(editor.getBody(), elm); + }; + var isTableCellNode = function (node) { + return node && /^(TH|TD)$/.test(node.nodeName); + }; + var isListNode = function (editor) { + return function (node) { + return node && /^(OL|UL|DL)$/.test(node.nodeName) && isChildOfBody(editor, node); + }; + }; + var getSelectedStyleType = function (editor) { + var listElm = editor.dom.getParent(editor.selection.getNode(), 'ol,ul'); + var style = editor.dom.getStyle(listElm, 'listStyleType'); + return Optional.from(style); + }; + + var findIndex = function (list, predicate) { + for (var index = 0; index < list.length; index++) { + var element = list[index]; + if (predicate(element)) { + return index; + } + } + return -1; + }; + var styleValueToText = function (styleValue) { + return styleValue.replace(/\-/g, ' ').replace(/\b\w/g, function (chr) { + return chr.toUpperCase(); + }); + }; + var isWithinList = function (editor, e, nodeName) { + var tableCellIndex = findIndex(e.parents, isTableCellNode); + var parents = tableCellIndex !== -1 ? e.parents.slice(0, tableCellIndex) : e.parents; + var lists = global$1.grep(parents, isListNode(editor)); + return lists.length > 0 && lists[0].nodeName === nodeName; + }; + var addSplitButton = function (editor, id, tooltip, cmd, nodeName, styles) { + editor.ui.registry.addSplitButton(id, { + tooltip: tooltip, + icon: nodeName === 'OL' ? 'ordered-list' : 'unordered-list', + presets: 'listpreview', + columns: 3, + fetch: function (callback) { + var items = global$1.map(styles, function (styleValue) { + var iconStyle = nodeName === 'OL' ? 'num' : 'bull'; + var iconName = styleValue === 'disc' || styleValue === 'decimal' ? 'default' : styleValue; + var itemValue = styleValue === 'default' ? '' : styleValue; + var displayText = styleValueToText(styleValue); + return { + type: 'choiceitem', + value: itemValue, + icon: 'list-' + iconStyle + '-' + iconName, + text: displayText + }; + }); + callback(items); + }, + onAction: function () { + return editor.execCommand(cmd); + }, + onItemAction: function (_splitButtonApi, value) { + applyListFormat(editor, nodeName, value); + }, + select: function (value) { + var listStyleType = getSelectedStyleType(editor); + return listStyleType.map(function (listStyle) { + return value === listStyle; + }).getOr(false); + }, + onSetup: function (api) { + var nodeChangeHandler = function (e) { + api.setActive(isWithinList(editor, e, nodeName)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + } + }); + }; + var addButton = function (editor, id, tooltip, cmd, nodeName, _styles) { + editor.ui.registry.addToggleButton(id, { + active: false, + tooltip: tooltip, + icon: nodeName === 'OL' ? 'ordered-list' : 'unordered-list', + onSetup: function (api) { + var nodeChangeHandler = function (e) { + api.setActive(isWithinList(editor, e, nodeName)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }, + onAction: function () { + return editor.execCommand(cmd); + } + }); + }; + var addControl = function (editor, id, tooltip, cmd, nodeName, styles) { + if (styles.length > 1) { + addSplitButton(editor, id, tooltip, cmd, nodeName, styles); + } else { + addButton(editor, id, tooltip, cmd, nodeName); + } + }; + var register$1 = function (editor) { + addControl(editor, 'numlist', 'Numbered list', 'InsertOrderedList', 'OL', getNumberStyles(editor)); + addControl(editor, 'bullist', 'Bullet list', 'InsertUnorderedList', 'UL', getBulletStyles(editor)); + }; + + function Plugin () { + global.add('advlist', function (editor) { + if (editor.hasPlugin('lists')) { + register$1(editor); + register(editor); + } + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/advlist/plugin.min.js b/src/assets/tinymce/plugins/advlist/plugin.min.js new file mode 100644 index 00000000..dfa80d9a --- /dev/null +++ b/src/assets/tinymce/plugins/advlist/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var n,e,t,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=function(n,e,t){var r="UL"===e?"InsertUnorderedList":"InsertOrderedList";n.execCommand(r,!1,!1===t?null:{"list-style-type":t})},l=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=function(n){return function(){return n}},c=i(!1),s=i(!0),o=function(){return a},a=(n=function(n){return n.isNone()},{fold:function(n,e){return n()},is:c,isSome:c,isNone:s,getOr:t=function(n){return n},getOrThunk:e=function(n){return n()},getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(undefined),or:t,orThunk:e,map:o,each:function(){},bind:o,exists:c,forall:s,filter:o,equals:n,equals_:n,toArray:function(){return[]},toString:i("none()")}),f=function(t){var n=i(t),e=function(){return o},r=function(n){return n(t)},o={fold:function(n,e){return e(t)},is:function(n){return t===n},isSome:s,isNone:c,getOr:n,getOrThunk:n,getOrDie:n,getOrNull:n,getOrUndefined:n,or:e,orThunk:e,map:function(n){return f(n(t))},each:function(n){n(t)},bind:r,exists:r,forall:r,filter:function(n){return n(t)?o:a},toArray:function(){return[t]},toString:function(){return"some("+t+")"},equals:function(n){return n.is(t)},equals_:function(n,e){return n.fold(c,function(n){return e(t,n)})}};return o},d=function(n){return null===n||n===undefined?a:f(n)},g=function(n){return n&&/^(TH|TD)$/.test(n.nodeName)},m=function(r){return function(n){return n&&/^(OL|UL|DL)$/.test(n.nodeName)&&(t=n,(e=r).$.contains(e.getBody(),t));var e,t}},p=function(n,e,t){var r=function(n,e){for(var t=0;t len) { + index = len; + } + } + return index; + }; + var setStart = function (rng, container, offset) { + if (container.nodeType !== 1 || container.hasChildNodes()) { + rng.setStart(container, scopeIndex(container, offset)); + } else { + rng.setStartBefore(container); + } + }; + var setEnd = function (rng, container, offset) { + if (container.nodeType !== 1 || container.hasChildNodes()) { + rng.setEnd(container, scopeIndex(container, offset)); + } else { + rng.setEndAfter(container); + } + }; + var parseCurrentLine = function (editor, endOffset, delimiter) { + var end, endContainer, bookmark, text, prev, len, rngText; + var autoLinkPattern = getAutoLinkPattern(editor); + var defaultLinkTarget = getDefaultLinkTarget(editor); + if (editor.selection.getNode().tagName === 'A') { + return; + } + var rng = editor.selection.getRng().cloneRange(); + if (rng.startOffset < 5) { + prev = rng.endContainer.previousSibling; + if (!prev) { + if (!rng.endContainer.firstChild || !rng.endContainer.firstChild.nextSibling) { + return; + } + prev = rng.endContainer.firstChild.nextSibling; + } + len = prev.length; + setStart(rng, prev, len); + setEnd(rng, prev, len); + if (rng.endOffset < 5) { + return; + } + end = rng.endOffset; + endContainer = prev; + } else { + endContainer = rng.endContainer; + if (endContainer.nodeType !== 3 && endContainer.firstChild) { + while (endContainer.nodeType !== 3 && endContainer.firstChild) { + endContainer = endContainer.firstChild; + } + if (endContainer.nodeType === 3) { + setStart(rng, endContainer, 0); + setEnd(rng, endContainer, endContainer.nodeValue.length); + } + } + if (rng.endOffset === 1) { + end = 2; + } else { + end = rng.endOffset - 1 - endOffset; + } + } + var start = end; + do { + setStart(rng, endContainer, end >= 2 ? end - 2 : 0); + setEnd(rng, endContainer, end >= 1 ? end - 1 : 0); + end -= 1; + rngText = rng.toString(); + } while (rngText !== ' ' && rngText !== '' && rngText.charCodeAt(0) !== 160 && end - 2 >= 0 && rngText !== delimiter); + if (rangeEqualsDelimiterOrSpace(rng.toString(), delimiter)) { + setStart(rng, endContainer, end); + setEnd(rng, endContainer, start); + end += 1; + } else if (rng.startOffset === 0) { + setStart(rng, endContainer, 0); + setEnd(rng, endContainer, start); + } else { + setStart(rng, endContainer, end); + setEnd(rng, endContainer, start); + } + text = rng.toString(); + if (text.charAt(text.length - 1) === '.') { + setEnd(rng, endContainer, start - 1); + } + text = rng.toString().trim(); + var matches = text.match(autoLinkPattern); + var protocol = getDefaultLinkProtocol(editor); + if (matches) { + if (matches[1] === 'www.') { + matches[1] = protocol + '://www.'; + } else if (/@$/.test(matches[1]) && !/^mailto:/.test(matches[1])) { + matches[1] = 'mailto:' + matches[1]; + } + bookmark = editor.selection.getBookmark(); + editor.selection.setRng(rng); + editor.execCommand('createlink', false, matches[1] + matches[2]); + if (defaultLinkTarget !== false) { + editor.dom.setAttrib(editor.selection.getNode(), 'target', defaultLinkTarget); + } + editor.selection.moveToBookmark(bookmark); + editor.nodeChanged(); + } + }; + var setup = function (editor) { + var autoUrlDetectState; + editor.on('keydown', function (e) { + if (e.keyCode === 13) { + return handleEnter(editor); + } + }); + if (global$1.browser.isIE()) { + editor.on('focus', function () { + if (!autoUrlDetectState) { + autoUrlDetectState = true; + try { + editor.execCommand('AutoUrlDetect', false, true); + } catch (ex) { + } + } + }); + return; + } + editor.on('keypress', function (e) { + if (e.keyCode === 41) { + return handleEclipse(editor); + } + }); + editor.on('keyup', function (e) { + if (e.keyCode === 32) { + return handleSpacebar(editor); + } + }); + }; + + function Plugin () { + global.add('autolink', function (editor) { + setup(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/autolink/plugin.min.js b/src/assets/tinymce/plugins/autolink/plugin.min.js new file mode 100644 index 00000000..24400541 --- /dev/null +++ b/src/assets/tinymce/plugins/autolink/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),o=tinymce.util.Tools.resolve("tinymce.Env"),i=function(e,t){var n;return t<0&&(t=0),3!==e.nodeType||(n=e.data.length) getAutoResizeMinHeight(editor)) { + resizeHeight = contentHeight + chromeHeight; + } + var maxHeight = getAutoResizeMaxHeight(editor); + if (maxHeight && resizeHeight > maxHeight) { + resizeHeight = maxHeight; + toggleScrolling(editor, true); + } else { + toggleScrolling(editor, false); + } + if (resizeHeight !== oldSize.get()) { + var deltaSize = resizeHeight - oldSize.get(); + dom.setStyle(editor.getContainer(), 'height', resizeHeight + 'px'); + oldSize.set(resizeHeight); + fireResizeEditor(editor); + if (global$1.browser.isSafari() && global$1.mac) { + var win = editor.getWin(); + win.scrollTo(win.pageXOffset, win.pageYOffset); + } + if (editor.hasFocus()) { + editor.selection.scrollIntoView(editor.selection.getNode()); + } + if (global$1.webkit && deltaSize < 0) { + resize(editor, oldSize); + } + } + }; + var setup = function (editor, oldSize) { + editor.on('init', function () { + var overflowPadding = getAutoResizeOverflowPadding(editor); + var dom = editor.dom; + dom.setStyles(editor.getDoc().documentElement, { height: 'auto' }); + dom.setStyles(editor.getBody(), { + 'paddingLeft': overflowPadding, + 'paddingRight': overflowPadding, + 'min-height': 0 + }); + }); + editor.on('NodeChange SetContent keyup FullscreenStateChanged ResizeContent', function () { + resize(editor, oldSize); + }); + if (shouldAutoResizeOnInit(editor)) { + editor.on('init', function () { + wait(editor, oldSize, 20, 100, function () { + wait(editor, oldSize, 5, 1000); + }); + }); + } + }; + + var register = function (editor, oldSize) { + editor.addCommand('mceAutoResize', function () { + resize(editor, oldSize); + }); + }; + + function Plugin () { + global.add('autoresize', function (editor) { + if (!editor.settings.hasOwnProperty('resize')) { + editor.settings.resize = false; + } + if (!editor.inline) { + var oldSize = Cell(0); + register(editor, oldSize); + setup(editor, oldSize); + } + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/autoresize/plugin.min.js b/src/assets/tinymce/plugins/autoresize/plugin.min.js new file mode 100644 index 00000000..01cb7d53 --- /dev/null +++ b/src/assets/tinymce/plugins/autoresize/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),h=tinymce.util.Tools.resolve("tinymce.Env"),r=tinymce.util.Tools.resolve("tinymce.util.Delay"),y=function(e){return e.getParam("min_height",e.getElement().offsetHeight,"number")},a=function(e,t,n,i,o){r.setEditorTimeout(e,function(){b(e,t),n--?a(e,t,n,i,o):o&&o()},i)},p=function(e,t){var n=e.getBody();n&&(n.style.overflowY=t?"":"hidden",t||(n.scrollTop=0))},v=function(e,t,n,i){var o=parseInt(e.getStyle(t,n,i),10);return isNaN(o)?0:o},b=function(e,t){var n,i,o,r,s,a,g,u,l,c,m,f=e.dom,d=e.getDoc();d&&((n=e).plugins.fullscreen&&n.plugins.fullscreen.isFullscreen()?p(e,!0):(i=d.documentElement,o=e.getParam("autoresize_bottom_margin",50,"number"),r=y(e),s=v(f,i,"margin-top",!0),a=v(f,i,"margin-bottom",!0),(g=i.offsetHeight+s+a+o)<0&&(g=0),g+(u=e.getContainer().offsetHeight-e.getContentAreaContainer().offsetHeight)>y(e)&&(r=g+u),(l=e.getParam("max_height",0,"number"))&&l getAutoSaveRetention(editor)) { + removeDraft(editor, false); + return false; + } + return true; + }; + var removeDraft = function (editor, fire) { + var prefix = getAutoSavePrefix(editor); + global$2.removeItem(prefix + 'draft'); + global$2.removeItem(prefix + 'time'); + if (fire !== false) { + fireRemoveDraft(editor); + } + }; + var storeDraft = function (editor) { + var prefix = getAutoSavePrefix(editor); + if (!isEmpty(editor) && editor.isDirty()) { + global$2.setItem(prefix + 'draft', editor.getContent({ + format: 'raw', + no_events: true + })); + global$2.setItem(prefix + 'time', new Date().getTime().toString()); + fireStoreDraft(editor); + } + }; + var restoreDraft = function (editor) { + var prefix = getAutoSavePrefix(editor); + if (hasDraft(editor)) { + editor.setContent(global$2.getItem(prefix + 'draft'), { format: 'raw' }); + fireRestoreDraft(editor); + } + }; + var startStoreDraft = function (editor) { + var interval = getAutoSaveInterval(editor); + global$1.setEditorInterval(editor, function () { + storeDraft(editor); + }, interval); + }; + var restoreLastDraft = function (editor) { + editor.undoManager.transact(function () { + restoreDraft(editor); + removeDraft(editor); + }); + editor.focus(); + }; + + var get = function (editor) { + return { + hasDraft: function () { + return hasDraft(editor); + }, + storeDraft: function () { + return storeDraft(editor); + }, + restoreDraft: function () { + return restoreDraft(editor); + }, + removeDraft: function (fire) { + return removeDraft(editor, fire); + }, + isEmpty: function (html) { + return isEmpty(editor, html); + } + }; + }; + + var global$4 = tinymce.util.Tools.resolve('tinymce.EditorManager'); + + var setup = function (editor) { + editor.editorManager.on('BeforeUnload', function (e) { + var msg; + global$3.each(global$4.get(), function (editor) { + if (editor.plugins.autosave) { + editor.plugins.autosave.storeDraft(); + } + if (!msg && editor.isDirty() && shouldAskBeforeUnload(editor)) { + msg = editor.translate('You have unsaved changes are you sure you want to navigate away?'); + } + }); + if (msg) { + e.preventDefault(); + e.returnValue = msg; + } + }); + }; + + var makeSetupHandler = function (editor) { + return function (api) { + api.setDisabled(!hasDraft(editor)); + var editorEventCallback = function () { + return api.setDisabled(!hasDraft(editor)); + }; + editor.on('StoreDraft RestoreDraft RemoveDraft', editorEventCallback); + return function () { + return editor.off('StoreDraft RestoreDraft RemoveDraft', editorEventCallback); + }; + }; + }; + var register = function (editor) { + startStoreDraft(editor); + editor.ui.registry.addButton('restoredraft', { + tooltip: 'Restore last draft', + icon: 'restore-draft', + onAction: function () { + restoreLastDraft(editor); + }, + onSetup: makeSetupHandler(editor) + }); + editor.ui.registry.addMenuItem('restoredraft', { + text: 'Restore last draft', + icon: 'restore-draft', + onAction: function () { + restoreLastDraft(editor); + }, + onSetup: makeSetupHandler(editor) + }); + }; + + function Plugin () { + global.add('autosave', function (editor) { + setup(editor); + register(editor); + editor.on('init', function () { + if (shouldRestoreWhenEmpty(editor) && editor.dom.isEmpty(editor.getBody())) { + restoreDraft(editor); + } + }); + return get(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/autosave/plugin.min.js b/src/assets/tinymce/plugins/autosave/plugin.min.js new file mode 100644 index 00000000..cd252940 --- /dev/null +++ b/src/assets/tinymce/plugins/autosave/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e,t=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=(e=undefined,function(t){return e===t}),r=tinymce.util.Tools.resolve("tinymce.util.Delay"),n=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),o=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=function(t,e){var r=t||e,n=/^(\d+)([ms]?)$/.exec(""+r);return(n[2]?{s:1e3,m:6e4}[n[2]]:1)*parseInt(r,10)},u=function(t){var e=document.location;return t.getParam("autosave_prefix","tinymce-autosave-{path}{query}{hash}-{id}-").replace(/{path}/g,e.pathname).replace(/{query}/g,e.search).replace(/{hash}/g,e.hash).replace(/{id}/g,t.id)},s=function(t,e){if(a(e))return t.dom.isEmpty(t.getBody());var r=o.trim(e);if(""===r)return!0;var n=(new DOMParser).parseFromString(r,"text/html");return t.dom.isEmpty(n)},f=function(t){var e=parseInt(n.getItem(u(t)+"time"),10)||0;return!((new Date).getTime()-e>i(t.getParam("autosave_retention"),"20m"))||(c(t,!1),!1)},c=function(t,e){var r=u(t);n.removeItem(r+"draft"),n.removeItem(r+"time"),!1!==e&&t.fire("RemoveDraft")},m=function(t){var e=u(t);!s(t)&&t.isDirty()&&(n.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),n.setItem(e+"time",(new Date).getTime().toString()),t.fire("StoreDraft"))},l=function(t){var e=u(t);f(t)&&(t.setContent(n.getItem(e+"draft"),{format:"raw"}),t.fire("RestoreDraft"))},v=function(t){var e=i(t.getParam("autosave_interval"),"30s");r.setEditorInterval(t,function(){m(t)},e)},d=function(t){t.undoManager.transact(function(){l(t),c(t)}),t.focus()},g=tinymce.util.Tools.resolve("tinymce.EditorManager"),y=function(r){return function(t){t.setDisabled(!f(r));var e=function(){return t.setDisabled(!f(r))};return r.on("StoreDraft RestoreDraft RemoveDraft",e),function(){return r.off("StoreDraft RestoreDraft RemoveDraft",e)}}};t.add("autosave",function(t){var e,r;return t.editorManager.on("BeforeUnload",function(t){var e;o.each(g.get(),function(t){t.plugins.autosave&&t.plugins.autosave.storeDraft(),!e&&t.isDirty()&&t.getParam("autosave_ask_before_unload",!0)&&(e=t.translate("You have unsaved changes are you sure you want to navigate away?"))}),e&&(t.preventDefault(),t.returnValue=e)}),v(e=t),e.ui.registry.addButton("restoredraft",{tooltip:"Restore last draft",icon:"restore-draft",onAction:function(){d(e)},onSetup:y(e)}),e.ui.registry.addMenuItem("restoredraft",{text:"Restore last draft",icon:"restore-draft",onAction:function(){d(e)},onSetup:y(e)}),t.on("init",function(){t.getParam("autosave_restore_when_empty",!1)&&t.dom.isEmpty(t.getBody())&&l(t)}),r=t,{hasDraft:function(){return f(r)},storeDraft:function(){return m(r)},restoreDraft:function(){return l(r)},removeDraft:function(t){return c(r,t)},isEmpty:function(t){return s(r,t)}}})}(); \ No newline at end of file diff --git a/src/assets/tinymce/plugins/bbcode/plugin.js b/src/assets/tinymce/plugins/bbcode/plugin.js new file mode 100644 index 00000000..5b7ac223 --- /dev/null +++ b/src/assets/tinymce/plugins/bbcode/plugin.js @@ -0,0 +1,99 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var html2bbcode = function (s) { + s = global$1.trim(s); + var rep = function (re, str) { + s = s.replace(re, str); + }; + rep(/(.*?)<\/a>/gi, '[url=$1]$2[/url]'); + rep(/(.*?)<\/font>/gi, '[code][color=$1]$2[/color][/code]'); + rep(/(.*?)<\/font>/gi, '[quote][color=$1]$2[/color][/quote]'); + rep(/(.*?)<\/font>/gi, '[code][color=$1]$2[/color][/code]'); + rep(/(.*?)<\/font>/gi, '[quote][color=$1]$2[/color][/quote]'); + rep(/(.*?)<\/span>/gi, '[color=$1]$2[/color]'); + rep(/(.*?)<\/font>/gi, '[color=$1]$2[/color]'); + rep(/(.*?)<\/span>/gi, '[size=$1]$2[/size]'); + rep(/(.*?)<\/font>/gi, '$1'); + rep(//gi, '[img]$1[/img]'); + rep(/(.*?)<\/span>/gi, '[code]$1[/code]'); + rep(/(.*?)<\/span>/gi, '[quote]$1[/quote]'); + rep(/(.*?)<\/strong>/gi, '[code][b]$1[/b][/code]'); + rep(/(.*?)<\/strong>/gi, '[quote][b]$1[/b][/quote]'); + rep(/(.*?)<\/em>/gi, '[code][i]$1[/i][/code]'); + rep(/(.*?)<\/em>/gi, '[quote][i]$1[/i][/quote]'); + rep(/(.*?)<\/u>/gi, '[code][u]$1[/u][/code]'); + rep(/(.*?)<\/u>/gi, '[quote][u]$1[/u][/quote]'); + rep(/<\/(strong|b)>/gi, '[/b]'); + rep(/<(strong|b)>/gi, '[b]'); + rep(/<\/(em|i)>/gi, '[/i]'); + rep(/<(em|i)>/gi, '[i]'); + rep(/<\/u>/gi, '[/u]'); + rep(/(.*?)<\/span>/gi, '[u]$1[/u]'); + rep(//gi, '[u]'); + rep(/]*>/gi, '[quote]'); + rep(/<\/blockquote>/gi, '[/quote]'); + rep(/
/gi, '\n'); + rep(//gi, '\n'); + rep(/
/gi, '\n'); + rep(/

/gi, ''); + rep(/<\/p>/gi, '\n'); + rep(/ |\u00a0/gi, ' '); + rep(/"/gi, '"'); + rep(/</gi, '<'); + rep(/>/gi, '>'); + rep(/&/gi, '&'); + return s; + }; + var bbcode2html = function (s) { + s = global$1.trim(s); + var rep = function (re, str) { + s = s.replace(re, str); + }; + rep(/\n/gi, '
'); + rep(/\[b\]/gi, ''); + rep(/\[\/b\]/gi, ''); + rep(/\[i\]/gi, ''); + rep(/\[\/i\]/gi, ''); + rep(/\[u\]/gi, ''); + rep(/\[\/u\]/gi, ''); + rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi, '$2'); + rep(/\[url\](.*?)\[\/url\]/gi, '$1'); + rep(/\[img\](.*?)\[\/img\]/gi, ''); + rep(/\[color=(.*?)\](.*?)\[\/color\]/gi, '$2'); + rep(/\[code\](.*?)\[\/code\]/gi, '$1 '); + rep(/\[quote.*?\](.*?)\[\/quote\]/gi, '$1 '); + return s; + }; + + function Plugin () { + global.add('bbcode', function (editor) { + editor.on('BeforeSetContent', function (e) { + e.content = bbcode2html(e.content); + }); + editor.on('PostProcess', function (e) { + if (e.set) { + e.content = bbcode2html(e.content); + } + if (e.get) { + e.content = html2bbcode(e.content); + } + }); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/bbcode/plugin.min.js b/src/assets/tinymce/plugins/bbcode/plugin.min.js new file mode 100644 index 00000000..a0471d46 --- /dev/null +++ b/src/assets/tinymce/plugins/bbcode/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var o=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=tinymce.util.Tools.resolve("tinymce.util.Tools"),t=function(t){t=e.trim(t);var o=function(o,e){t=t.replace(o,e)};return o(/\n/gi,"
"),o(/\[b\]/gi,""),o(/\[\/b\]/gi,""),o(/\[i\]/gi,""),o(/\[\/i\]/gi,""),o(/\[u\]/gi,""),o(/\[\/u\]/gi,""),o(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'$2'),o(/\[url\](.*?)\[\/url\]/gi,'$1'),o(/\[img\](.*?)\[\/img\]/gi,''),o(/\[color=(.*?)\](.*?)\[\/color\]/gi,'$2'),o(/\[code\](.*?)\[\/code\]/gi,'$1 '),o(/\[quote.*?\](.*?)\[\/quote\]/gi,'$1 '),t};o.add("bbcode",function(o){o.on("BeforeSetContent",function(o){o.content=t(o.content)}),o.on("PostProcess",function(o){o.set&&(o.content=t(o.content)),o.get&&(o.content=function(t){t=e.trim(t);var o=function(o,e){t=t.replace(o,e)};return o(/(.*?)<\/a>/gi,"[url=$1]$2[/url]"),o(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),o(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),o(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),o(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),o(/(.*?)<\/span>/gi,"[color=$1]$2[/color]"),o(/(.*?)<\/font>/gi,"[color=$1]$2[/color]"),o(/(.*?)<\/span>/gi,"[size=$1]$2[/size]"),o(/(.*?)<\/font>/gi,"$1"),o(//gi,"[img]$1[/img]"),o(/(.*?)<\/span>/gi,"[code]$1[/code]"),o(/(.*?)<\/span>/gi,"[quote]$1[/quote]"),o(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),o(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),o(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),o(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),o(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),o(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"),o(/<\/(strong|b)>/gi,"[/b]"),o(/<(strong|b)>/gi,"[b]"),o(/<\/(em|i)>/gi,"[/i]"),o(/<(em|i)>/gi,"[i]"),o(/<\/u>/gi,"[/u]"),o(/(.*?)<\/span>/gi,"[u]$1[/u]"),o(//gi,"[u]"),o(/]*>/gi,"[quote]"),o(/<\/blockquote>/gi,"[/quote]"),o(/
/gi,"\n"),o(//gi,"\n"),o(/
/gi,"\n"),o(/

/gi,""),o(/<\/p>/gi,"\n"),o(/ |\u00a0/gi," "),o(/"/gi,'"'),o(/</gi,"<"),o(/>/gi,">"),o(/&/gi,"&"),t}(o.content))})})}(); \ No newline at end of file diff --git a/src/assets/tinymce/plugins/charmap/plugin.js b/src/assets/tinymce/plugins/charmap/plugin.js new file mode 100644 index 00000000..cceb2ec1 --- /dev/null +++ b/src/assets/tinymce/plugins/charmap/plugin.js @@ -0,0 +1,1706 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var fireInsertCustomChar = function (editor, chr) { + return editor.fire('insertCustomChar', { chr: chr }); + }; + + var insertChar = function (editor, chr) { + var evtChr = fireInsertCustomChar(editor, chr).chr; + editor.execCommand('mceInsertContent', false, evtChr); + }; + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Optional = { + some: some, + none: none, + from: from + }; + + var typeOf = function (x) { + var t = typeof x; + if (x === null) { + return 'null'; + } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } else { + return t; + } + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isArray = isType('array'); + + var nativePush = Array.prototype.push; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var findUntil = function (xs, pred, until) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + return Optional.some(x); + } else if (until(x, i)) { + break; + } + } + return Optional.none(); + }; + var find = function (xs, pred) { + return findUntil(xs, pred, never); + }; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var bind = function (xs, f) { + return flatten(map(xs, f)); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var getCharMap = function (editor) { + return editor.getParam('charmap'); + }; + var getCharMapAppend = function (editor) { + return editor.getParam('charmap_append'); + }; + + var isArray$1 = global$1.isArray; + var UserDefined = 'User Defined'; + var getDefaultCharMap = function () { + return [ + { + name: 'Currency', + characters: [ + [ + 36, + 'dollar sign' + ], + [ + 162, + 'cent sign' + ], + [ + 8364, + 'euro sign' + ], + [ + 163, + 'pound sign' + ], + [ + 165, + 'yen sign' + ], + [ + 164, + 'currency sign' + ], + [ + 8352, + 'euro-currency sign' + ], + [ + 8353, + 'colon sign' + ], + [ + 8354, + 'cruzeiro sign' + ], + [ + 8355, + 'french franc sign' + ], + [ + 8356, + 'lira sign' + ], + [ + 8357, + 'mill sign' + ], + [ + 8358, + 'naira sign' + ], + [ + 8359, + 'peseta sign' + ], + [ + 8360, + 'rupee sign' + ], + [ + 8361, + 'won sign' + ], + [ + 8362, + 'new sheqel sign' + ], + [ + 8363, + 'dong sign' + ], + [ + 8365, + 'kip sign' + ], + [ + 8366, + 'tugrik sign' + ], + [ + 8367, + 'drachma sign' + ], + [ + 8368, + 'german penny symbol' + ], + [ + 8369, + 'peso sign' + ], + [ + 8370, + 'guarani sign' + ], + [ + 8371, + 'austral sign' + ], + [ + 8372, + 'hryvnia sign' + ], + [ + 8373, + 'cedi sign' + ], + [ + 8374, + 'livre tournois sign' + ], + [ + 8375, + 'spesmilo sign' + ], + [ + 8376, + 'tenge sign' + ], + [ + 8377, + 'indian rupee sign' + ], + [ + 8378, + 'turkish lira sign' + ], + [ + 8379, + 'nordic mark sign' + ], + [ + 8380, + 'manat sign' + ], + [ + 8381, + 'ruble sign' + ], + [ + 20870, + 'yen character' + ], + [ + 20803, + 'yuan character' + ], + [ + 22291, + 'yuan character, in hong kong and taiwan' + ], + [ + 22278, + 'yen/yuan character variant one' + ] + ] + }, + { + name: 'Text', + characters: [ + [ + 169, + 'copyright sign' + ], + [ + 174, + 'registered sign' + ], + [ + 8482, + 'trade mark sign' + ], + [ + 8240, + 'per mille sign' + ], + [ + 181, + 'micro sign' + ], + [ + 183, + 'middle dot' + ], + [ + 8226, + 'bullet' + ], + [ + 8230, + 'three dot leader' + ], + [ + 8242, + 'minutes / feet' + ], + [ + 8243, + 'seconds / inches' + ], + [ + 167, + 'section sign' + ], + [ + 182, + 'paragraph sign' + ], + [ + 223, + 'sharp s / ess-zed' + ] + ] + }, + { + name: 'Quotations', + characters: [ + [ + 8249, + 'single left-pointing angle quotation mark' + ], + [ + 8250, + 'single right-pointing angle quotation mark' + ], + [ + 171, + 'left pointing guillemet' + ], + [ + 187, + 'right pointing guillemet' + ], + [ + 8216, + 'left single quotation mark' + ], + [ + 8217, + 'right single quotation mark' + ], + [ + 8220, + 'left double quotation mark' + ], + [ + 8221, + 'right double quotation mark' + ], + [ + 8218, + 'single low-9 quotation mark' + ], + [ + 8222, + 'double low-9 quotation mark' + ], + [ + 60, + 'less-than sign' + ], + [ + 62, + 'greater-than sign' + ], + [ + 8804, + 'less-than or equal to' + ], + [ + 8805, + 'greater-than or equal to' + ], + [ + 8211, + 'en dash' + ], + [ + 8212, + 'em dash' + ], + [ + 175, + 'macron' + ], + [ + 8254, + 'overline' + ], + [ + 164, + 'currency sign' + ], + [ + 166, + 'broken bar' + ], + [ + 168, + 'diaeresis' + ], + [ + 161, + 'inverted exclamation mark' + ], + [ + 191, + 'turned question mark' + ], + [ + 710, + 'circumflex accent' + ], + [ + 732, + 'small tilde' + ], + [ + 176, + 'degree sign' + ], + [ + 8722, + 'minus sign' + ], + [ + 177, + 'plus-minus sign' + ], + [ + 247, + 'division sign' + ], + [ + 8260, + 'fraction slash' + ], + [ + 215, + 'multiplication sign' + ], + [ + 185, + 'superscript one' + ], + [ + 178, + 'superscript two' + ], + [ + 179, + 'superscript three' + ], + [ + 188, + 'fraction one quarter' + ], + [ + 189, + 'fraction one half' + ], + [ + 190, + 'fraction three quarters' + ] + ] + }, + { + name: 'Mathematical', + characters: [ + [ + 402, + 'function / florin' + ], + [ + 8747, + 'integral' + ], + [ + 8721, + 'n-ary sumation' + ], + [ + 8734, + 'infinity' + ], + [ + 8730, + 'square root' + ], + [ + 8764, + 'similar to' + ], + [ + 8773, + 'approximately equal to' + ], + [ + 8776, + 'almost equal to' + ], + [ + 8800, + 'not equal to' + ], + [ + 8801, + 'identical to' + ], + [ + 8712, + 'element of' + ], + [ + 8713, + 'not an element of' + ], + [ + 8715, + 'contains as member' + ], + [ + 8719, + 'n-ary product' + ], + [ + 8743, + 'logical and' + ], + [ + 8744, + 'logical or' + ], + [ + 172, + 'not sign' + ], + [ + 8745, + 'intersection' + ], + [ + 8746, + 'union' + ], + [ + 8706, + 'partial differential' + ], + [ + 8704, + 'for all' + ], + [ + 8707, + 'there exists' + ], + [ + 8709, + 'diameter' + ], + [ + 8711, + 'backward difference' + ], + [ + 8727, + 'asterisk operator' + ], + [ + 8733, + 'proportional to' + ], + [ + 8736, + 'angle' + ] + ] + }, + { + name: 'Extended Latin', + characters: [ + [ + 192, + 'A - grave' + ], + [ + 193, + 'A - acute' + ], + [ + 194, + 'A - circumflex' + ], + [ + 195, + 'A - tilde' + ], + [ + 196, + 'A - diaeresis' + ], + [ + 197, + 'A - ring above' + ], + [ + 256, + 'A - macron' + ], + [ + 198, + 'ligature AE' + ], + [ + 199, + 'C - cedilla' + ], + [ + 200, + 'E - grave' + ], + [ + 201, + 'E - acute' + ], + [ + 202, + 'E - circumflex' + ], + [ + 203, + 'E - diaeresis' + ], + [ + 274, + 'E - macron' + ], + [ + 204, + 'I - grave' + ], + [ + 205, + 'I - acute' + ], + [ + 206, + 'I - circumflex' + ], + [ + 207, + 'I - diaeresis' + ], + [ + 298, + 'I - macron' + ], + [ + 208, + 'ETH' + ], + [ + 209, + 'N - tilde' + ], + [ + 210, + 'O - grave' + ], + [ + 211, + 'O - acute' + ], + [ + 212, + 'O - circumflex' + ], + [ + 213, + 'O - tilde' + ], + [ + 214, + 'O - diaeresis' + ], + [ + 216, + 'O - slash' + ], + [ + 332, + 'O - macron' + ], + [ + 338, + 'ligature OE' + ], + [ + 352, + 'S - caron' + ], + [ + 217, + 'U - grave' + ], + [ + 218, + 'U - acute' + ], + [ + 219, + 'U - circumflex' + ], + [ + 220, + 'U - diaeresis' + ], + [ + 362, + 'U - macron' + ], + [ + 221, + 'Y - acute' + ], + [ + 376, + 'Y - diaeresis' + ], + [ + 562, + 'Y - macron' + ], + [ + 222, + 'THORN' + ], + [ + 224, + 'a - grave' + ], + [ + 225, + 'a - acute' + ], + [ + 226, + 'a - circumflex' + ], + [ + 227, + 'a - tilde' + ], + [ + 228, + 'a - diaeresis' + ], + [ + 229, + 'a - ring above' + ], + [ + 257, + 'a - macron' + ], + [ + 230, + 'ligature ae' + ], + [ + 231, + 'c - cedilla' + ], + [ + 232, + 'e - grave' + ], + [ + 233, + 'e - acute' + ], + [ + 234, + 'e - circumflex' + ], + [ + 235, + 'e - diaeresis' + ], + [ + 275, + 'e - macron' + ], + [ + 236, + 'i - grave' + ], + [ + 237, + 'i - acute' + ], + [ + 238, + 'i - circumflex' + ], + [ + 239, + 'i - diaeresis' + ], + [ + 299, + 'i - macron' + ], + [ + 240, + 'eth' + ], + [ + 241, + 'n - tilde' + ], + [ + 242, + 'o - grave' + ], + [ + 243, + 'o - acute' + ], + [ + 244, + 'o - circumflex' + ], + [ + 245, + 'o - tilde' + ], + [ + 246, + 'o - diaeresis' + ], + [ + 248, + 'o slash' + ], + [ + 333, + 'o macron' + ], + [ + 339, + 'ligature oe' + ], + [ + 353, + 's - caron' + ], + [ + 249, + 'u - grave' + ], + [ + 250, + 'u - acute' + ], + [ + 251, + 'u - circumflex' + ], + [ + 252, + 'u - diaeresis' + ], + [ + 363, + 'u - macron' + ], + [ + 253, + 'y - acute' + ], + [ + 254, + 'thorn' + ], + [ + 255, + 'y - diaeresis' + ], + [ + 563, + 'y - macron' + ], + [ + 913, + 'Alpha' + ], + [ + 914, + 'Beta' + ], + [ + 915, + 'Gamma' + ], + [ + 916, + 'Delta' + ], + [ + 917, + 'Epsilon' + ], + [ + 918, + 'Zeta' + ], + [ + 919, + 'Eta' + ], + [ + 920, + 'Theta' + ], + [ + 921, + 'Iota' + ], + [ + 922, + 'Kappa' + ], + [ + 923, + 'Lambda' + ], + [ + 924, + 'Mu' + ], + [ + 925, + 'Nu' + ], + [ + 926, + 'Xi' + ], + [ + 927, + 'Omicron' + ], + [ + 928, + 'Pi' + ], + [ + 929, + 'Rho' + ], + [ + 931, + 'Sigma' + ], + [ + 932, + 'Tau' + ], + [ + 933, + 'Upsilon' + ], + [ + 934, + 'Phi' + ], + [ + 935, + 'Chi' + ], + [ + 936, + 'Psi' + ], + [ + 937, + 'Omega' + ], + [ + 945, + 'alpha' + ], + [ + 946, + 'beta' + ], + [ + 947, + 'gamma' + ], + [ + 948, + 'delta' + ], + [ + 949, + 'epsilon' + ], + [ + 950, + 'zeta' + ], + [ + 951, + 'eta' + ], + [ + 952, + 'theta' + ], + [ + 953, + 'iota' + ], + [ + 954, + 'kappa' + ], + [ + 955, + 'lambda' + ], + [ + 956, + 'mu' + ], + [ + 957, + 'nu' + ], + [ + 958, + 'xi' + ], + [ + 959, + 'omicron' + ], + [ + 960, + 'pi' + ], + [ + 961, + 'rho' + ], + [ + 962, + 'final sigma' + ], + [ + 963, + 'sigma' + ], + [ + 964, + 'tau' + ], + [ + 965, + 'upsilon' + ], + [ + 966, + 'phi' + ], + [ + 967, + 'chi' + ], + [ + 968, + 'psi' + ], + [ + 969, + 'omega' + ] + ] + }, + { + name: 'Symbols', + characters: [ + [ + 8501, + 'alef symbol' + ], + [ + 982, + 'pi symbol' + ], + [ + 8476, + 'real part symbol' + ], + [ + 978, + 'upsilon - hook symbol' + ], + [ + 8472, + 'Weierstrass p' + ], + [ + 8465, + 'imaginary part' + ] + ] + }, + { + name: 'Arrows', + characters: [ + [ + 8592, + 'leftwards arrow' + ], + [ + 8593, + 'upwards arrow' + ], + [ + 8594, + 'rightwards arrow' + ], + [ + 8595, + 'downwards arrow' + ], + [ + 8596, + 'left right arrow' + ], + [ + 8629, + 'carriage return' + ], + [ + 8656, + 'leftwards double arrow' + ], + [ + 8657, + 'upwards double arrow' + ], + [ + 8658, + 'rightwards double arrow' + ], + [ + 8659, + 'downwards double arrow' + ], + [ + 8660, + 'left right double arrow' + ], + [ + 8756, + 'therefore' + ], + [ + 8834, + 'subset of' + ], + [ + 8835, + 'superset of' + ], + [ + 8836, + 'not a subset of' + ], + [ + 8838, + 'subset of or equal to' + ], + [ + 8839, + 'superset of or equal to' + ], + [ + 8853, + 'circled plus' + ], + [ + 8855, + 'circled times' + ], + [ + 8869, + 'perpendicular' + ], + [ + 8901, + 'dot operator' + ], + [ + 8968, + 'left ceiling' + ], + [ + 8969, + 'right ceiling' + ], + [ + 8970, + 'left floor' + ], + [ + 8971, + 'right floor' + ], + [ + 9001, + 'left-pointing angle bracket' + ], + [ + 9002, + 'right-pointing angle bracket' + ], + [ + 9674, + 'lozenge' + ], + [ + 9824, + 'black spade suit' + ], + [ + 9827, + 'black club suit' + ], + [ + 9829, + 'black heart suit' + ], + [ + 9830, + 'black diamond suit' + ], + [ + 8194, + 'en space' + ], + [ + 8195, + 'em space' + ], + [ + 8201, + 'thin space' + ], + [ + 8204, + 'zero width non-joiner' + ], + [ + 8205, + 'zero width joiner' + ], + [ + 8206, + 'left-to-right mark' + ], + [ + 8207, + 'right-to-left mark' + ] + ] + } + ]; + }; + var charmapFilter = function (charmap) { + return global$1.grep(charmap, function (item) { + return isArray$1(item) && item.length === 2; + }); + }; + var getCharsFromSetting = function (settingValue) { + if (isArray$1(settingValue)) { + return [].concat(charmapFilter(settingValue)); + } + if (typeof settingValue === 'function') { + return settingValue(); + } + return []; + }; + var extendCharMap = function (editor, charmap) { + var userCharMap = getCharMap(editor); + if (userCharMap) { + charmap = [{ + name: UserDefined, + characters: getCharsFromSetting(userCharMap) + }]; + } + var userCharMapAppend = getCharMapAppend(editor); + if (userCharMapAppend) { + var userDefinedGroup = global$1.grep(charmap, function (cg) { + return cg.name === UserDefined; + }); + if (userDefinedGroup.length) { + userDefinedGroup[0].characters = [].concat(userDefinedGroup[0].characters).concat(getCharsFromSetting(userCharMapAppend)); + return charmap; + } + return [].concat(charmap).concat({ + name: UserDefined, + characters: getCharsFromSetting(userCharMapAppend) + }); + } + return charmap; + }; + var getCharMap$1 = function (editor) { + var groups = extendCharMap(editor, getDefaultCharMap()); + return groups.length > 1 ? [{ + name: 'All', + characters: bind(groups, function (g) { + return g.characters; + }) + }].concat(groups) : groups; + }; + + var get = function (editor) { + var getCharMap = function () { + return getCharMap$1(editor); + }; + var insertChar$1 = function (chr) { + insertChar(editor, chr); + }; + return { + getCharMap: getCharMap, + insertChar: insertChar$1 + }; + }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var last = function (fn, rate) { + var timer = null; + var cancel = function () { + if (timer !== null) { + clearTimeout(timer); + timer = null; + } + }; + var throttle = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (timer !== null) { + clearTimeout(timer); + } + timer = setTimeout(function () { + fn.apply(null, args); + timer = null; + }, rate); + }; + return { + cancel: cancel, + throttle: throttle + }; + }; + + var nativeFromCodePoint = String.fromCodePoint; + var contains = function (str, substr) { + return str.indexOf(substr) !== -1; + }; + var fromCodePoint = function () { + var codePoints = []; + for (var _i = 0; _i < arguments.length; _i++) { + codePoints[_i] = arguments[_i]; + } + if (nativeFromCodePoint) { + return nativeFromCodePoint.apply(void 0, codePoints); + } else { + var codeUnits = []; + var codeLen = 0; + var result = ''; + for (var index = 0, len = codePoints.length; index !== len; ++index) { + var codePoint = +codePoints[index]; + if (!(codePoint < 1114111 && codePoint >>> 0 === codePoint)) { + throw RangeError('Invalid code point: ' + codePoint); + } + if (codePoint <= 65535) { + codeLen = codeUnits.push(codePoint); + } else { + codePoint -= 65536; + codeLen = codeUnits.push((codePoint >> 10) + 55296, codePoint % 1024 + 56320); + } + if (codeLen >= 16383) { + result += String.fromCharCode.apply(null, codeUnits); + codeUnits.length = 0; + } + } + return result + String.fromCharCode.apply(null, codeUnits); + } + }; + + var charMatches = function (charCode, name, lowerCasePattern) { + if (contains(fromCodePoint(charCode).toLowerCase(), lowerCasePattern)) { + return true; + } else { + return contains(name.toLowerCase(), lowerCasePattern) || contains(name.toLowerCase().replace(/\s+/g, ''), lowerCasePattern); + } + }; + var scan = function (group, pattern) { + var matches = []; + var lowerCasePattern = pattern.toLowerCase(); + each(group.characters, function (g) { + if (charMatches(g[0], g[1], lowerCasePattern)) { + matches.push(g); + } + }); + return map(matches, function (m) { + return { + text: m[1], + value: fromCodePoint(m[0]), + icon: fromCodePoint(m[0]) + }; + }); + }; + + var patternName = 'pattern'; + var open = function (editor, charMap) { + var makeGroupItems = function () { + return [ + { + label: 'Search', + type: 'input', + name: patternName + }, + { + type: 'collection', + name: 'results' + } + ]; + }; + var makeTabs = function () { + return map(charMap, function (charGroup) { + return { + title: charGroup.name, + name: charGroup.name, + items: makeGroupItems() + }; + }); + }; + var makePanel = function () { + return { + type: 'panel', + items: makeGroupItems() + }; + }; + var makeTabPanel = function () { + return { + type: 'tabpanel', + tabs: makeTabs() + }; + }; + var currentTab = charMap.length === 1 ? Cell(UserDefined) : Cell('All'); + var scanAndSet = function (dialogApi, pattern) { + find(charMap, function (group) { + return group.name === currentTab.get(); + }).each(function (f) { + var items = scan(f, pattern); + dialogApi.setData({ results: items }); + }); + }; + var SEARCH_DELAY = 40; + var updateFilter = last(function (dialogApi) { + var pattern = dialogApi.getData().pattern; + scanAndSet(dialogApi, pattern); + }, SEARCH_DELAY); + var body = charMap.length === 1 ? makePanel() : makeTabPanel(); + var initialData = { + pattern: '', + results: scan(charMap[0], '') + }; + var bridgeSpec = { + title: 'Special Character', + size: 'normal', + body: body, + buttons: [{ + type: 'cancel', + name: 'close', + text: 'Close', + primary: true + }], + initialData: initialData, + onAction: function (api, details) { + if (details.name === 'results') { + insertChar(editor, details.value); + api.close(); + } + }, + onTabChange: function (dialogApi, details) { + currentTab.set(details.newTabName); + updateFilter.throttle(dialogApi); + }, + onChange: function (dialogApi, changeData) { + if (changeData.name === patternName) { + updateFilter.throttle(dialogApi); + } + } + }; + var dialogApi = editor.windowManager.open(bridgeSpec); + dialogApi.focus(patternName); + }; + + var register = function (editor, charMap) { + editor.addCommand('mceShowCharmap', function () { + open(editor, charMap); + }); + }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var init = function (editor, all) { + editor.ui.registry.addAutocompleter('charmap', { + ch: ':', + columns: 'auto', + minChars: 2, + fetch: function (pattern, _maxResults) { + return new global$2(function (resolve, _reject) { + resolve(scan(all, pattern)); + }); + }, + onAction: function (autocompleteApi, rng, value) { + editor.selection.setRng(rng); + editor.insertContent(value); + autocompleteApi.hide(); + } + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('charmap', { + icon: 'insert-character', + tooltip: 'Special character', + onAction: function () { + return editor.execCommand('mceShowCharmap'); + } + }); + editor.ui.registry.addMenuItem('charmap', { + icon: 'insert-character', + text: 'Special character...', + onAction: function () { + return editor.execCommand('mceShowCharmap'); + } + }); + }; + + function Plugin () { + global.add('charmap', function (editor) { + var charMap = getCharMap$1(editor); + register(editor, charMap); + register$1(editor); + init(editor, charMap[0]); + return get(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/charmap/plugin.min.js b/src/assets/tinymce/plugins/charmap/plugin.min.js new file mode 100644 index 00000000..3df46f29 --- /dev/null +++ b/src/assets/tinymce/plugins/charmap/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e,n,r,t,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),s=function(e,n){var r,t=(r=n,e.fire("insertCustomChar",{chr:r}).chr);e.execCommand("mceInsertContent",!1,t)},i=function(e){return function(){return e}},o=i(!1),c=i(!0),u=function(){return l},l=(e=function(e){return e.isNone()},{fold:function(e,n){return e()},is:o,isSome:o,isNone:c,getOr:r=function(e){return e},getOrThunk:n=function(e){return e()},getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(undefined),or:r,orThunk:n,map:u,each:function(){},bind:u,exists:o,forall:c,filter:u,equals:e,equals_:e,toArray:function(){return[]},toString:i("none()")}),g=function(r){var e=i(r),n=function(){return a},t=function(e){return e(r)},a={fold:function(e,n){return n(r)},is:function(e){return r===e},isSome:c,isNone:o,getOr:e,getOrThunk:e,getOrDie:e,getOrNull:e,getOrUndefined:e,or:n,orThunk:n,map:function(e){return g(e(r))},each:function(e){e(r)},bind:t,exists:t,forall:t,filter:function(e){return e(r)?a:l},toArray:function(){return[r]},toString:function(){return"some("+r+")"},equals:function(e){return e.is(r)},equals_:function(e,n){return e.fold(o,function(e){return n(r,e)})}};return a},m={some:g,none:u,from:function(e){return null===e||e===undefined?l:g(e)}},f=(t="array",function(e){return r=typeof(n=e),(null===n?"null":"object"==r&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":r)===t;var n,r}),h=Array.prototype.push,p=function(e,n){for(var r=e.length,t=new Array(r),a=0;a>>0===o))throw RangeError("Invalid code point: "+o);16383<=(o<=65535?r.push(o):(o-=65536,r.push(55296+(o>>10),o%1024+56320)))&&(t+=String.fromCharCode.apply(null,r),r.length=0)}return t+String.fromCharCode.apply(null,r)},S=function(e,n){var a=[],i=n.toLowerCase();return function(e,n){for(var r=0,t=e.length;r= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); + }; + var head = function (xs) { + return get(xs, 0); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + function isCodeSample(elm) { + return elm && elm.nodeName === 'PRE' && elm.className.indexOf('language-') !== -1; + } + function trimArg(predicateFn) { + return function (arg1, arg2) { + return predicateFn(arg2); + }; + } + + var Global = typeof window !== 'undefined' ? window : Function('return this;')(); + + var exports$1 = {}, module = { exports: exports$1 }, global$2 = {}; + (function (define, exports, module, require) { + var oldprism = window.Prism; + window.Prism = { manual: true }; + (function (f) { + if (typeof exports === 'object' && typeof module !== 'undefined') { + module.exports = f(); + } else if (typeof define === 'function' && define.amd) { + define([], f); + } else { + var g; + if (typeof window !== 'undefined') { + g = window; + } else if (typeof global$2 !== 'undefined') { + g = global$2; + } else if (typeof self !== 'undefined') { + g = self; + } else { + g = this; + } + g.EphoxContactWrapper = f(); + } + }(function () { + return function () { + function r(e, n, t) { + function o(i, f) { + if (!n[i]) { + if (!e[i]) { + var c = 'function' == typeof require && require; + if (!f && c) + return c(i, !0); + if (u) + return u(i, !0); + var a = new Error('Cannot find module \'' + i + '\''); + throw a.code = 'MODULE_NOT_FOUND', a; + } + var p = n[i] = { exports: {} }; + e[i][0].call(p.exports, function (r) { + var n = e[i][1][r]; + return o(n || r); + }, p, p.exports, r, e, n, t); + } + return n[i].exports; + } + for (var u = 'function' == typeof require && require, i = 0; i < t.length; i++) + o(t[i]); + return o; + } + return r; + }()({ + 1: [ + function (require, module, exports) { + Prism.languages.c = Prism.languages.extend('clike', { + 'comment': { + pattern: /\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/, + greedy: true + }, + 'class-name': { + pattern: /(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+/, + lookbehind: true + }, + 'keyword': /\b(?:__attribute__|_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/, + 'function': /[a-z_]\w*(?=\s*\()/i, + 'operator': />>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/, + 'number': /(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i + }); + Prism.languages.insertBefore('c', 'string', { + 'macro': { + pattern: /(^\s*)#\s*[a-z]+(?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im, + lookbehind: true, + greedy: true, + alias: 'property', + inside: { + 'string': [ + { + pattern: /^(#\s*include\s*)<[^>]+>/, + lookbehind: true + }, + Prism.languages.c['string'] + ], + 'comment': Prism.languages.c['comment'], + 'directive': { + pattern: /^(#\s*)[a-z]+/, + lookbehind: true, + alias: 'keyword' + }, + 'directive-hash': /^#/, + 'punctuation': /##|\\(?=[\r\n])/, + 'expression': { + pattern: /\S[\s\S]*/, + inside: Prism.languages.c + } + } + }, + 'constant': /\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/ + }); + delete Prism.languages.c['boolean']; + }, + {} + ], + 2: [ + function (require, module, exports) { + Prism.languages.clike = { + 'comment': [ + { + pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, + lookbehind: true + }, + { + pattern: /(^|[^\\:])\/\/.*/, + lookbehind: true, + greedy: true + } + ], + 'string': { + pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: true + }, + 'class-name': { + pattern: /(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i, + lookbehind: true, + inside: { 'punctuation': /[.\\]/ } + }, + 'keyword': /\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/, + 'boolean': /\b(?:true|false)\b/, + 'function': /\w+(?=\()/, + 'number': /\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i, + 'operator': /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/, + 'punctuation': /[{}[\];(),.:]/ + }; + }, + {} + ], + 3: [ + function (require, module, exports) { + (function (global) { + (function () { + var _self = typeof window !== 'undefined' ? window : typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope ? self : {}; + var Prism = function (_self) { + var lang = /\blang(?:uage)?-([\w-]+)\b/i; + var uniqueId = 0; + var _ = { + manual: _self.Prism && _self.Prism.manual, + disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler, + util: { + encode: function encode(tokens) { + if (tokens instanceof Token) { + return new Token(tokens.type, encode(tokens.content), tokens.alias); + } else if (Array.isArray(tokens)) { + return tokens.map(encode); + } else { + return tokens.replace(/&/g, '&').replace(/' + env.content + ''; + }; + function matchGrammar(text, tokenList, grammar, startNode, startPos, rematch) { + for (var token in grammar) { + if (!grammar.hasOwnProperty(token) || !grammar[token]) { + continue; + } + var patterns = grammar[token]; + patterns = Array.isArray(patterns) ? patterns : [patterns]; + for (var j = 0; j < patterns.length; ++j) { + if (rematch && rematch.cause == token + ',' + j) { + return; + } + var patternObj = patterns[j], inside = patternObj.inside, lookbehind = !!patternObj.lookbehind, greedy = !!patternObj.greedy, lookbehindLength = 0, alias = patternObj.alias; + if (greedy && !patternObj.pattern.global) { + var flags = patternObj.pattern.toString().match(/[imsuy]*$/)[0]; + patternObj.pattern = RegExp(patternObj.pattern.source, flags + 'g'); + } + var pattern = patternObj.pattern || patternObj; + for (var currentNode = startNode.next, pos = startPos; currentNode !== tokenList.tail; pos += currentNode.value.length, currentNode = currentNode.next) { + if (rematch && pos >= rematch.reach) { + break; + } + var str = currentNode.value; + if (tokenList.length > text.length) { + return; + } + if (str instanceof Token) { + continue; + } + var removeCount = 1; + if (greedy && currentNode != tokenList.tail.prev) { + pattern.lastIndex = pos; + var match = pattern.exec(text); + if (!match) { + break; + } + var from = match.index + (lookbehind && match[1] ? match[1].length : 0); + var to = match.index + match[0].length; + var p = pos; + p += currentNode.value.length; + while (from >= p) { + currentNode = currentNode.next; + p += currentNode.value.length; + } + p -= currentNode.value.length; + pos = p; + if (currentNode.value instanceof Token) { + continue; + } + for (var k = currentNode; k !== tokenList.tail && (p < to || typeof k.value === 'string'); k = k.next) { + removeCount++; + p += k.value.length; + } + removeCount--; + str = text.slice(pos, p); + match.index -= pos; + } else { + pattern.lastIndex = 0; + var match = pattern.exec(str); + } + if (!match) { + continue; + } + if (lookbehind) { + lookbehindLength = match[1] ? match[1].length : 0; + } + var from = match.index + lookbehindLength, matchStr = match[0].slice(lookbehindLength), to = from + matchStr.length, before = str.slice(0, from), after = str.slice(to); + var reach = pos + str.length; + if (rematch && reach > rematch.reach) { + rematch.reach = reach; + } + var removeFrom = currentNode.prev; + if (before) { + removeFrom = addAfter(tokenList, removeFrom, before); + pos += before.length; + } + removeRange(tokenList, removeFrom, removeCount); + var wrapped = new Token(token, inside ? _.tokenize(matchStr, inside) : matchStr, alias, matchStr); + currentNode = addAfter(tokenList, removeFrom, wrapped); + if (after) { + addAfter(tokenList, currentNode, after); + } + if (removeCount > 1) { + matchGrammar(text, tokenList, grammar, currentNode.prev, pos, { + cause: token + ',' + j, + reach: reach + }); + } + } + } + } + } + function LinkedList() { + var head = { + value: null, + prev: null, + next: null + }; + var tail = { + value: null, + prev: head, + next: null + }; + head.next = tail; + this.head = head; + this.tail = tail; + this.length = 0; + } + function addAfter(list, node, value) { + var next = node.next; + var newNode = { + value: value, + prev: node, + next: next + }; + node.next = newNode; + next.prev = newNode; + list.length++; + return newNode; + } + function removeRange(list, node, count) { + var next = node.next; + for (var i = 0; i < count && next !== list.tail; i++) { + next = next.next; + } + node.next = next; + next.prev = node; + list.length -= i; + } + function toArray(list) { + var array = []; + var node = list.head.next; + while (node !== list.tail) { + array.push(node.value); + node = node.next; + } + return array; + } + if (!_self.document) { + if (!_self.addEventListener) { + return _; + } + if (!_.disableWorkerMessageHandler) { + _self.addEventListener('message', function (evt) { + var message = JSON.parse(evt.data), lang = message.language, code = message.code, immediateClose = message.immediateClose; + _self.postMessage(_.highlight(code, _.languages[lang], lang)); + if (immediateClose) { + _self.close(); + } + }, false); + } + return _; + } + var script = _.util.currentScript(); + if (script) { + _.filename = script.src; + if (script.hasAttribute('data-manual')) { + _.manual = true; + } + } + function highlightAutomaticallyCallback() { + if (!_.manual) { + _.highlightAll(); + } + } + if (!_.manual) { + var readyState = document.readyState; + if (readyState === 'loading' || readyState === 'interactive' && script && script.defer) { + document.addEventListener('DOMContentLoaded', highlightAutomaticallyCallback); + } else { + if (window.requestAnimationFrame) { + window.requestAnimationFrame(highlightAutomaticallyCallback); + } else { + window.setTimeout(highlightAutomaticallyCallback, 16); + } + } + } + return _; + }(_self); + if (typeof module !== 'undefined' && module.exports) { + module.exports = Prism; + } + if (typeof global !== 'undefined') { + global.Prism = Prism; + } + }.call(this)); + }.call(this, typeof global$2 !== 'undefined' ? global$2 : typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : {})); + }, + {} + ], + 4: [ + function (require, module, exports) { + (function (Prism) { + var keyword = /\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char8_t|char16_t|char32_t|class|compl|concept|const|consteval|constexpr|constinit|const_cast|continue|co_await|co_return|co_yield|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/; + Prism.languages.cpp = Prism.languages.extend('c', { + 'class-name': [ + { + pattern: RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g, function () { + return keyword.source; + })), + lookbehind: true + }, + /\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/, + /\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i, + /\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/ + ], + 'keyword': keyword, + 'number': { + pattern: /(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i, + greedy: true + }, + 'operator': />>=?|<<=?|->|([-+&|:])\1|[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/, + 'boolean': /\b(?:true|false)\b/ + }); + Prism.languages.insertBefore('cpp', 'string', { + 'raw-string': { + pattern: /R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/, + alias: 'string', + greedy: true + } + }); + Prism.languages.insertBefore('cpp', 'class-name', { + 'base-clause': { + pattern: /(\b(?:class|struct)\s+\w+\s*:\s*)(?:[^;{}"'])+?(?=\s*[;{])/, + lookbehind: true, + greedy: true, + inside: Prism.languages.extend('cpp', {}) + } + }); + Prism.languages.insertBefore('inside', 'operator', { 'class-name': /\b[a-z_]\w*\b(?!\s*::)/i }, Prism.languages.cpp['base-clause']); + }(Prism)); + }, + {} + ], + 5: [ + function (require, module, exports) { + (function (Prism) { + function replace(pattern, replacements) { + return pattern.replace(/<<(\d+)>>/g, function (m, index) { + return '(?:' + replacements[+index] + ')'; + }); + } + function re(pattern, replacements, flags) { + return RegExp(replace(pattern, replacements), flags || ''); + } + function nested(pattern, depthLog2) { + for (var i = 0; i < depthLog2; i++) { + pattern = pattern.replace(/<>/g, function () { + return '(?:' + pattern + ')'; + }); + } + return pattern.replace(/<>/g, '[^\\s\\S]'); + } + var keywordKinds = { + type: 'bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void', + typeDeclaration: 'class enum interface struct', + contextual: 'add alias and ascending async await by descending from get global group into join let nameof not notnull on or orderby partial remove select set unmanaged value when where where', + other: 'abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield' + }; + function keywordsToPattern(words) { + return '\\b(?:' + words.trim().replace(/ /g, '|') + ')\\b'; + } + var typeDeclarationKeywords = keywordsToPattern(keywordKinds.typeDeclaration); + var keywords = RegExp(keywordsToPattern(keywordKinds.type + ' ' + keywordKinds.typeDeclaration + ' ' + keywordKinds.contextual + ' ' + keywordKinds.other)); + var nonTypeKeywords = keywordsToPattern(keywordKinds.typeDeclaration + ' ' + keywordKinds.contextual + ' ' + keywordKinds.other); + var nonContextualKeywords = keywordsToPattern(keywordKinds.type + ' ' + keywordKinds.typeDeclaration + ' ' + keywordKinds.other); + var generic = nested(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source, 2); + var nestedRound = nested(/\((?:[^()]|<>)*\)/.source, 2); + var name = /@?\b[A-Za-z_]\w*\b/.source; + var genericName = replace(/<<0>>(?:\s*<<1>>)?/.source, [ + name, + generic + ]); + var identifier = replace(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source, [ + nonTypeKeywords, + genericName + ]); + var array = /\[\s*(?:,\s*)*\]/.source; + var typeExpressionWithoutTuple = replace(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source, [ + identifier, + array + ]); + var tupleElement = replace(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source, [ + generic, + nestedRound, + array + ]); + var tuple = replace(/\(<<0>>+(?:,<<0>>+)+\)/.source, [tupleElement]); + var typeExpression = replace(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source, [ + tuple, + identifier, + array + ]); + var typeInside = { + 'keyword': keywords, + 'punctuation': /[<>()?,.:[\]]/ + }; + var character = /'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source; + var regularString = /"(?:\\.|[^\\"\r\n])*"/.source; + var verbatimString = /@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source; + Prism.languages.csharp = Prism.languages.extend('clike', { + 'string': [ + { + pattern: re(/(^|[^$\\])<<0>>/.source, [verbatimString]), + lookbehind: true, + greedy: true + }, + { + pattern: re(/(^|[^@$\\])<<0>>/.source, [regularString]), + lookbehind: true, + greedy: true + }, + { + pattern: RegExp(character), + greedy: true, + alias: 'character' + } + ], + 'class-name': [ + { + pattern: re(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source, [identifier]), + lookbehind: true, + inside: typeInside + }, + { + pattern: re(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source, [ + name, + typeExpression + ]), + lookbehind: true, + inside: typeInside + }, + { + pattern: re(/(\busing\s+)<<0>>(?=\s*=)/.source, [name]), + lookbehind: true + }, + { + pattern: re(/(\b<<0>>\s+)<<1>>/.source, [ + typeDeclarationKeywords, + genericName + ]), + lookbehind: true, + inside: typeInside + }, + { + pattern: re(/(\bcatch\s*\(\s*)<<0>>/.source, [identifier]), + lookbehind: true, + inside: typeInside + }, + { + pattern: re(/(\bwhere\s+)<<0>>/.source, [name]), + lookbehind: true + }, + { + pattern: re(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source, [typeExpressionWithoutTuple]), + lookbehind: true, + inside: typeInside + }, + { + pattern: re(/\b<<0>>(?=\s+(?!<<1>>)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source, [ + typeExpression, + nonContextualKeywords, + name + ]), + inside: typeInside + } + ], + 'keyword': keywords, + 'number': /(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:ul|lu|[dflmu])?\b/i, + 'operator': />>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/, + 'punctuation': /\?\.?|::|[{}[\];(),.:]/ + }); + Prism.languages.insertBefore('csharp', 'number', { + 'range': { + pattern: /\.\./, + alias: 'operator' + } + }); + Prism.languages.insertBefore('csharp', 'punctuation', { + 'named-parameter': { + pattern: re(/([(,]\s*)<<0>>(?=\s*:)/.source, [name]), + lookbehind: true, + alias: 'punctuation' + } + }); + Prism.languages.insertBefore('csharp', 'class-name', { + 'namespace': { + pattern: re(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source, [name]), + lookbehind: true, + inside: { 'punctuation': /\./ } + }, + 'type-expression': { + pattern: re(/(\b(?:default|typeof|sizeof)\s*\(\s*)(?:[^()\s]|\s(?!\s*\))|<<0>>)*(?=\s*\))/.source, [nestedRound]), + lookbehind: true, + alias: 'class-name', + inside: typeInside + }, + 'return-type': { + pattern: re(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source, [ + typeExpression, + identifier + ]), + inside: typeInside, + alias: 'class-name' + }, + 'constructor-invocation': { + pattern: re(/(\bnew\s+)<<0>>(?=\s*[[({])/.source, [typeExpression]), + lookbehind: true, + inside: typeInside, + alias: 'class-name' + }, + 'generic-method': { + pattern: re(/<<0>>\s*<<1>>(?=\s*\()/.source, [ + name, + generic + ]), + inside: { + 'function': re(/^<<0>>/.source, [name]), + 'generic': { + pattern: RegExp(generic), + alias: 'class-name', + inside: typeInside + } + } + }, + 'type-list': { + pattern: re(/\b((?:<<0>>\s+<<1>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>)(?:\s*,\s*(?:<<3>>|<<4>>))*(?=\s*(?:where|[{;]|=>|$))/.source, [ + typeDeclarationKeywords, + genericName, + name, + typeExpression, + keywords.source + ]), + lookbehind: true, + inside: { + 'keyword': keywords, + 'class-name': { + pattern: RegExp(typeExpression), + greedy: true, + inside: typeInside + }, + 'punctuation': /,/ + } + }, + 'preprocessor': { + pattern: /(^\s*)#.*/m, + lookbehind: true, + alias: 'property', + inside: { + 'directive': { + pattern: /(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/, + lookbehind: true, + alias: 'keyword' + } + } + } + }); + var regularStringOrCharacter = regularString + '|' + character; + var regularStringCharacterOrComment = replace(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source, [regularStringOrCharacter]); + var roundExpression = nested(replace(/[^"'/()]|<<0>>|\(<>*\)/.source, [regularStringCharacterOrComment]), 2); + var attrTarget = /\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source; + var attr = replace(/<<0>>(?:\s*\(<<1>>*\))?/.source, [ + identifier, + roundExpression + ]); + Prism.languages.insertBefore('csharp', 'class-name', { + 'attribute': { + pattern: re(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source, [ + attrTarget, + attr + ]), + lookbehind: true, + greedy: true, + inside: { + 'target': { + pattern: re(/^<<0>>(?=\s*:)/.source, [attrTarget]), + alias: 'keyword' + }, + 'attribute-arguments': { + pattern: re(/\(<<0>>*\)/.source, [roundExpression]), + inside: Prism.languages.csharp + }, + 'class-name': { + pattern: RegExp(identifier), + inside: { 'punctuation': /\./ } + }, + 'punctuation': /[:,]/ + } + } + }); + var formatString = /:[^}\r\n]+/.source; + var mInterpolationRound = nested(replace(/[^"'/()]|<<0>>|\(<>*\)/.source, [regularStringCharacterOrComment]), 2); + var mInterpolation = replace(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source, [ + mInterpolationRound, + formatString + ]); + var sInterpolationRound = nested(replace(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source, [regularStringOrCharacter]), 2); + var sInterpolation = replace(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source, [ + sInterpolationRound, + formatString + ]); + function createInterpolationInside(interpolation, interpolationRound) { + return { + 'interpolation': { + pattern: re(/((?:^|[^{])(?:\{\{)*)<<0>>/.source, [interpolation]), + lookbehind: true, + inside: { + 'format-string': { + pattern: re(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source, [ + interpolationRound, + formatString + ]), + lookbehind: true, + inside: { 'punctuation': /^:/ } + }, + 'punctuation': /^\{|\}$/, + 'expression': { + pattern: /[\s\S]+/, + alias: 'language-csharp', + inside: Prism.languages.csharp + } + } + }, + 'string': /[\s\S]+/ + }; + } + Prism.languages.insertBefore('csharp', 'string', { + 'interpolation-string': [ + { + pattern: re(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source, [mInterpolation]), + lookbehind: true, + greedy: true, + inside: createInterpolationInside(mInterpolation, mInterpolationRound) + }, + { + pattern: re(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source, [sInterpolation]), + lookbehind: true, + greedy: true, + inside: createInterpolationInside(sInterpolation, sInterpolationRound) + } + ] + }); + }(Prism)); + Prism.languages.dotnet = Prism.languages.cs = Prism.languages.csharp; + }, + {} + ], + 6: [ + function (require, module, exports) { + (function (Prism) { + var string = /("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/; + Prism.languages.css = { + 'comment': /\/\*[\s\S]*?\*\//, + 'atrule': { + pattern: /@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/, + inside: { + 'rule': /^@[\w-]+/, + 'selector-function-argument': { + pattern: /(\bselector\s*\((?!\s*\))\s*)(?:[^()]|\((?:[^()]|\([^()]*\))*\))+?(?=\s*\))/, + lookbehind: true, + alias: 'selector' + }, + 'keyword': { + pattern: /(^|[^\w-])(?:and|not|only|or)(?![\w-])/, + lookbehind: true + } + } + }, + 'url': { + pattern: RegExp('\\burl\\((?:' + string.source + '|' + /(?:[^\\\r\n()"']|\\[\s\S])*/.source + ')\\)', 'i'), + greedy: true, + inside: { + 'function': /^url/i, + 'punctuation': /^\(|\)$/, + 'string': { + pattern: RegExp('^' + string.source + '$'), + alias: 'url' + } + } + }, + 'selector': RegExp('[^{}\\s](?:[^{};"\']|' + string.source + ')*?(?=\\s*\\{)'), + 'string': { + pattern: string, + greedy: true + }, + 'property': /[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i, + 'important': /!important\b/i, + 'function': /[-a-z0-9]+(?=\()/i, + 'punctuation': /[(){};:,]/ + }; + Prism.languages.css['atrule'].inside.rest = Prism.languages.css; + var markup = Prism.languages.markup; + if (markup) { + markup.tag.addInlined('style', 'css'); + Prism.languages.insertBefore('inside', 'attr-value', { + 'style-attr': { + pattern: /\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i, + inside: { + 'attr-name': { + pattern: /^\s*style/i, + inside: markup.tag.inside + }, + 'punctuation': /^\s*=\s*['"]|['"]\s*$/, + 'attr-value': { + pattern: /.+/i, + inside: Prism.languages.css + } + }, + alias: 'language-css' + } + }, markup.tag); + } + }(Prism)); + }, + {} + ], + 7: [ + function (require, module, exports) { + (function (Prism) { + var keywords = /\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|record|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/; + var className = /\b[A-Z](?:\w*[a-z]\w*)?\b/; + Prism.languages.java = Prism.languages.extend('clike', { + 'class-name': [ + className, + /\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/ + ], + 'keyword': keywords, + 'function': [ + Prism.languages.clike.function, + { + pattern: /(\:\:)[a-z_]\w*/, + lookbehind: true + } + ], + 'number': /\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i, + 'operator': { + pattern: /(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m, + lookbehind: true + } + }); + Prism.languages.insertBefore('java', 'string', { + 'triple-quoted-string': { + pattern: /"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/, + greedy: true, + alias: 'string' + } + }); + Prism.languages.insertBefore('java', 'class-name', { + 'annotation': { + alias: 'punctuation', + pattern: /(^|[^.])@\w+/, + lookbehind: true + }, + 'namespace': { + pattern: RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g, function () { + return keywords.source; + })), + lookbehind: true, + inside: { 'punctuation': /\./ } + }, + 'generics': { + pattern: /<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/, + inside: { + 'class-name': className, + 'keyword': keywords, + 'punctuation': /[<>(),.:]/, + 'operator': /[?&|]/ + } + } + }); + }(Prism)); + }, + {} + ], + 8: [ + function (require, module, exports) { + Prism.languages.javascript = Prism.languages.extend('clike', { + 'class-name': [ + Prism.languages.clike['class-name'], + { + pattern: /(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/, + lookbehind: true + } + ], + 'keyword': [ + { + pattern: /((?:^|})\s*)(?:catch|finally)\b/, + lookbehind: true + }, + { + pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|(?:get|set)(?=\s*[\[$\w\xA0-\uFFFF])|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/, + lookbehind: true + } + ], + 'number': /\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/, + 'function': /#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/, + 'operator': /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/ + }); + Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/; + Prism.languages.insertBefore('javascript', 'keyword', { + 'regex': { + pattern: /((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/, + lookbehind: true, + greedy: true, + inside: { + 'regex-source': { + pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/, + lookbehind: true, + alias: 'language-regex', + inside: Prism.languages.regex + }, + 'regex-flags': /[a-z]+$/, + 'regex-delimiter': /^\/|\/$/ + } + }, + 'function-variable': { + pattern: /#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/, + alias: 'function' + }, + 'parameter': [ + { + pattern: /(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/, + lookbehind: true, + inside: Prism.languages.javascript + }, + { + pattern: /[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i, + inside: Prism.languages.javascript + }, + { + pattern: /(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/, + lookbehind: true, + inside: Prism.languages.javascript + }, + { + pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/, + lookbehind: true, + inside: Prism.languages.javascript + } + ], + 'constant': /\b[A-Z](?:[A-Z_]|\dx?)*\b/ + }); + Prism.languages.insertBefore('javascript', 'string', { + 'template-string': { + pattern: /`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/, + greedy: true, + inside: { + 'template-punctuation': { + pattern: /^`|`$/, + alias: 'string' + }, + 'interpolation': { + pattern: /((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/, + lookbehind: true, + inside: { + 'interpolation-punctuation': { + pattern: /^\${|}$/, + alias: 'punctuation' + }, + rest: Prism.languages.javascript + } + }, + 'string': /[\s\S]+/ + } + } + }); + if (Prism.languages.markup) { + Prism.languages.markup.tag.addInlined('script', 'javascript'); + } + Prism.languages.js = Prism.languages.javascript; + }, + {} + ], + 9: [ + function (require, module, exports) { + (function (Prism) { + function getPlaceholder(language, index) { + return '___' + language.toUpperCase() + index + '___'; + } + Object.defineProperties(Prism.languages['markup-templating'] = {}, { + buildPlaceholders: { + value: function (env, language, placeholderPattern, replaceFilter) { + if (env.language !== language) { + return; + } + var tokenStack = env.tokenStack = []; + env.code = env.code.replace(placeholderPattern, function (match) { + if (typeof replaceFilter === 'function' && !replaceFilter(match)) { + return match; + } + var i = tokenStack.length; + var placeholder; + while (env.code.indexOf(placeholder = getPlaceholder(language, i)) !== -1) + ++i; + tokenStack[i] = match; + return placeholder; + }); + env.grammar = Prism.languages.markup; + } + }, + tokenizePlaceholders: { + value: function (env, language) { + if (env.language !== language || !env.tokenStack) { + return; + } + env.grammar = Prism.languages[language]; + var j = 0; + var keys = Object.keys(env.tokenStack); + function walkTokens(tokens) { + for (var i = 0; i < tokens.length; i++) { + if (j >= keys.length) { + break; + } + var token = tokens[i]; + if (typeof token === 'string' || token.content && typeof token.content === 'string') { + var k = keys[j]; + var t = env.tokenStack[k]; + var s = typeof token === 'string' ? token : token.content; + var placeholder = getPlaceholder(language, k); + var index = s.indexOf(placeholder); + if (index > -1) { + ++j; + var before = s.substring(0, index); + var middle = new Prism.Token(language, Prism.tokenize(t, env.grammar), 'language-' + language, t); + var after = s.substring(index + placeholder.length); + var replacement = []; + if (before) { + replacement.push.apply(replacement, walkTokens([before])); + } + replacement.push(middle); + if (after) { + replacement.push.apply(replacement, walkTokens([after])); + } + if (typeof token === 'string') { + tokens.splice.apply(tokens, [ + i, + 1 + ].concat(replacement)); + } else { + token.content = replacement; + } + } + } else if (token.content) { + walkTokens(token.content); + } + } + return tokens; + } + walkTokens(env.tokens); + } + } + }); + }(Prism)); + }, + {} + ], + 10: [ + function (require, module, exports) { + Prism.languages.markup = { + 'comment': //, + 'prolog': /<\?[\s\S]+?\?>/, + 'doctype': { + pattern: /"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i, + greedy: true, + inside: { + 'internal-subset': { + pattern: /(\[)[\s\S]+(?=\]>$)/, + lookbehind: true, + greedy: true, + inside: null + }, + 'string': { + pattern: /"[^"]*"|'[^']*'/, + greedy: true + }, + 'punctuation': /^$|[[\]]/, + 'doctype-tag': /^DOCTYPE/, + 'name': /[^\s<>'"]+/ + } + }, + 'cdata': //i, + 'tag': { + pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/, + greedy: true, + inside: { + 'tag': { + pattern: /^<\/?[^\s>\/]+/, + inside: { + 'punctuation': /^<\/?/, + 'namespace': /^[^\s>\/:]+:/ + } + }, + 'attr-value': { + pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/, + inside: { + 'punctuation': [ + { + pattern: /^=/, + alias: 'attr-equals' + }, + /"|'/ + ] + } + }, + 'punctuation': /\/?>/, + 'attr-name': { + pattern: /[^\s>\/]+/, + inside: { 'namespace': /^[^\s>\/:]+:/ } + } + } + }, + 'entity': [ + { + pattern: /&[\da-z]{1,8};/i, + alias: 'named-entity' + }, + /&#x?[\da-f]{1,8};/i + ] + }; + Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] = Prism.languages.markup['entity']; + Prism.languages.markup['doctype'].inside['internal-subset'].inside = Prism.languages.markup; + Prism.hooks.add('wrap', function (env) { + if (env.type === 'entity') { + env.attributes['title'] = env.content.replace(/&/, '&'); + } + }); + Object.defineProperty(Prism.languages.markup.tag, 'addInlined', { + value: function addInlined(tagName, lang) { + var includedCdataInside = {}; + includedCdataInside['language-' + lang] = { + pattern: /(^$)/i, + lookbehind: true, + inside: Prism.languages[lang] + }; + includedCdataInside['cdata'] = /^$/i; + var inside = { + 'included-cdata': { + pattern: //i, + inside: includedCdataInside + } + }; + inside['language-' + lang] = { + pattern: /[\s\S]+/, + inside: Prism.languages[lang] + }; + var def = {}; + def[tagName] = { + pattern: RegExp(/(<__[\s\S]*?>)(?:))*\]\]>|(?!)/.source.replace(/__/g, function () { + return tagName; + }), 'i'), + lookbehind: true, + greedy: true, + inside: inside + }; + Prism.languages.insertBefore('markup', 'cdata', def); + } + }); + Prism.languages.html = Prism.languages.markup; + Prism.languages.mathml = Prism.languages.markup; + Prism.languages.svg = Prism.languages.markup; + Prism.languages.xml = Prism.languages.extend('markup', {}); + Prism.languages.ssml = Prism.languages.xml; + Prism.languages.atom = Prism.languages.xml; + Prism.languages.rss = Prism.languages.xml; + }, + {} + ], + 11: [ + function (require, module, exports) { + (function (Prism) { + Prism.languages.php = Prism.languages.extend('clike', { + 'keyword': /\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i, + 'boolean': { + pattern: /\b(?:false|true)\b/i, + alias: 'constant' + }, + 'constant': [ + /\b[A-Z_][A-Z0-9_]*\b/, + /\b(?:null)\b/i + ], + 'comment': { + pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/, + lookbehind: true + } + }); + Prism.languages.insertBefore('php', 'string', { + 'shell-comment': { + pattern: /(^|[^\\])#.*/, + lookbehind: true, + alias: 'comment' + } + }); + Prism.languages.insertBefore('php', 'comment', { + 'delimiter': { + pattern: /\?>$|^<\?(?:php(?=\s)|=)?/i, + alias: 'important' + } + }); + Prism.languages.insertBefore('php', 'keyword', { + 'variable': /\$+(?:\w+\b|(?={))/i, + 'package': { + pattern: /(\\|namespace\s+|use\s+)[\w\\]+/, + lookbehind: true, + inside: { punctuation: /\\/ } + } + }); + Prism.languages.insertBefore('php', 'operator', { + 'property': { + pattern: /(->)[\w]+/, + lookbehind: true + } + }); + var string_interpolation = { + pattern: /{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)*)/, + lookbehind: true, + inside: Prism.languages.php + }; + Prism.languages.insertBefore('php', 'string', { + 'nowdoc-string': { + pattern: /<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/, + greedy: true, + alias: 'string', + inside: { + 'delimiter': { + pattern: /^<<<'[^']+'|[a-z_]\w*;$/i, + alias: 'symbol', + inside: { 'punctuation': /^<<<'?|[';]$/ } + } + } + }, + 'heredoc-string': { + pattern: /<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i, + greedy: true, + alias: 'string', + inside: { + 'delimiter': { + pattern: /^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i, + alias: 'symbol', + inside: { 'punctuation': /^<<<"?|[";]$/ } + }, + 'interpolation': string_interpolation + } + }, + 'single-quoted-string': { + pattern: /'(?:\\[\s\S]|[^\\'])*'/, + greedy: true, + alias: 'string' + }, + 'double-quoted-string': { + pattern: /"(?:\\[\s\S]|[^\\"])*"/, + greedy: true, + alias: 'string', + inside: { 'interpolation': string_interpolation } + } + }); + delete Prism.languages.php['string']; + Prism.hooks.add('before-tokenize', function (env) { + if (!/<\?/.test(env.code)) { + return; + } + var phpPattern = /<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#)(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|\/\*[\s\S]*?(?:\*\/|$))*?(?:\?>|$)/ig; + Prism.languages['markup-templating'].buildPlaceholders(env, 'php', phpPattern); + }); + Prism.hooks.add('after-tokenize', function (env) { + Prism.languages['markup-templating'].tokenizePlaceholders(env, 'php'); + }); + }(Prism)); + }, + {} + ], + 12: [ + function (require, module, exports) { + Prism.languages.python = { + 'comment': { + pattern: /(^|[^\\])#.*/, + lookbehind: true + }, + 'string-interpolation': { + pattern: /(?:f|rf|fr)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i, + greedy: true, + inside: { + 'interpolation': { + pattern: /((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/, + lookbehind: true, + inside: { + 'format-spec': { + pattern: /(:)[^:(){}]+(?=}$)/, + lookbehind: true + }, + 'conversion-option': { + pattern: /![sra](?=[:}]$)/, + alias: 'punctuation' + }, + rest: null + } + }, + 'string': /[\s\S]+/ + } + }, + 'triple-quoted-string': { + pattern: /(?:[rub]|rb|br)?("""|''')[\s\S]*?\1/i, + greedy: true, + alias: 'string' + }, + 'string': { + pattern: /(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i, + greedy: true + }, + 'function': { + pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g, + lookbehind: true + }, + 'class-name': { + pattern: /(\bclass\s+)\w+/i, + lookbehind: true + }, + 'decorator': { + pattern: /(^\s*)@\w+(?:\.\w+)*/im, + lookbehind: true, + alias: [ + 'annotation', + 'punctuation' + ], + inside: { 'punctuation': /\./ } + }, + 'keyword': /\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/, + 'builtin': /\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/, + 'boolean': /\b(?:True|False|None)\b/, + 'number': /(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i, + 'operator': /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/, + 'punctuation': /[{}[\];(),.:]/ + }; + Prism.languages.python['string-interpolation'].inside['interpolation'].inside.rest = Prism.languages.python; + Prism.languages.py = Prism.languages.python; + }, + {} + ], + 13: [ + function (require, module, exports) { + (function (Prism) { + Prism.languages.ruby = Prism.languages.extend('clike', { + 'comment': [ + /#.*/, + { + pattern: /^=begin\s[\s\S]*?^=end/m, + greedy: true + } + ], + 'class-name': { + pattern: /(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i, + lookbehind: true, + inside: { 'punctuation': /[.\\]/ } + }, + 'keyword': /\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/ + }); + var interpolation = { + pattern: /#\{[^}]+\}/, + inside: { + 'delimiter': { + pattern: /^#\{|\}$/, + alias: 'tag' + }, + rest: Prism.languages.ruby + } + }; + delete Prism.languages.ruby.function; + Prism.languages.insertBefore('ruby', 'keyword', { + 'regex': [ + { + pattern: RegExp(/%r/.source + '(?:' + [ + /([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1[gim]{0,3}/.source, + /\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/.source, + /\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/.source, + /\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/.source, + /<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/.source + ].join('|') + ')'), + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})]))/, + lookbehind: true, + greedy: true + } + ], + 'variable': /[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/, + 'symbol': { + pattern: /(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/, + lookbehind: true + }, + 'method-definition': { + pattern: /(\bdef\s+)[\w.]+/, + lookbehind: true, + inside: { + 'function': /\w+$/, + rest: Prism.languages.ruby + } + } + }); + Prism.languages.insertBefore('ruby', 'number', { + 'builtin': /\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/, + 'constant': /\b[A-Z]\w*(?:[?!]|\b)/ + }); + Prism.languages.ruby.string = [ + { + pattern: RegExp(/%[qQiIwWxs]?/.source + '(?:' + [ + /([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source, + /\((?:[^()\\]|\\[\s\S])*\)/.source, + /\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/.source, + /\[(?:[^\[\]\\]|\\[\s\S])*\]/.source, + /<(?:[^<>\\]|\\[\s\S])*>/.source + ].join('|') + ')'), + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /("|')(?:#\{[^}]+\}|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: true, + inside: { 'interpolation': interpolation } + } + ]; + Prism.languages.rb = Prism.languages.ruby; + }(Prism)); + }, + {} + ], + 14: [ + function (require, module, exports) { + var Prism = require('prismjs/components/prism-core'); + require('prismjs/components/prism-clike'); + require('prismjs/components/prism-markup-templating'); + require('prismjs/components/prism-c'); + require('prismjs/components/prism-cpp'); + require('prismjs/components/prism-csharp'); + require('prismjs/components/prism-css'); + require('prismjs/components/prism-java'); + require('prismjs/components/prism-javascript'); + require('prismjs/components/prism-markup'); + require('prismjs/components/prism-php'); + require('prismjs/components/prism-python'); + require('prismjs/components/prism-ruby'); + module.exports = { boltExport: Prism }; + }, + { + 'prismjs/components/prism-c': 1, + 'prismjs/components/prism-clike': 2, + 'prismjs/components/prism-core': 3, + 'prismjs/components/prism-cpp': 4, + 'prismjs/components/prism-csharp': 5, + 'prismjs/components/prism-css': 6, + 'prismjs/components/prism-java': 7, + 'prismjs/components/prism-javascript': 8, + 'prismjs/components/prism-markup': 10, + 'prismjs/components/prism-markup-templating': 9, + 'prismjs/components/prism-php': 11, + 'prismjs/components/prism-python': 12, + 'prismjs/components/prism-ruby': 13 + } + ] + }, {}, [14])(14); + })); + var prism = window.Prism; + window.Prism = oldprism; + return prism; + }(undefined, exports$1, module, undefined)); + var Prism$1 = module.exports.boltExport; + + var getLanguages = function (editor) { + return editor.getParam('codesample_languages'); + }; + var useGlobalPrismJS = function (editor) { + return editor.getParam('codesample_global_prismjs', false, 'boolean'); + }; + + var get$1 = function (editor) { + return Global.Prism && useGlobalPrismJS(editor) ? Global.Prism : Prism$1; + }; + + var getSelectedCodeSample = function (editor) { + var node = editor.selection ? editor.selection.getNode() : null; + if (isCodeSample(node)) { + return Optional.some(node); + } + return Optional.none(); + }; + var insertCodeSample = function (editor, language, code) { + editor.undoManager.transact(function () { + var node = getSelectedCodeSample(editor); + code = global$1.DOM.encode(code); + return node.fold(function () { + editor.insertContent('

' + code + '
'); + editor.selection.select(editor.$('#__new').removeAttr('id')[0]); + }, function (n) { + editor.dom.setAttrib(n, 'class', 'language-' + language); + n.innerHTML = code; + get$1(editor).highlightElement(n); + editor.selection.select(n); + }); + }); + }; + var getCurrentCode = function (editor) { + var node = getSelectedCodeSample(editor); + return node.fold(function () { + return ''; + }, function (n) { + return n.textContent; + }); + }; + + var getLanguages$1 = function (editor) { + var defaultLanguages = [ + { + text: 'HTML/XML', + value: 'markup' + }, + { + text: 'JavaScript', + value: 'javascript' + }, + { + text: 'CSS', + value: 'css' + }, + { + text: 'PHP', + value: 'php' + }, + { + text: 'Ruby', + value: 'ruby' + }, + { + text: 'Python', + value: 'python' + }, + { + text: 'Java', + value: 'java' + }, + { + text: 'C', + value: 'c' + }, + { + text: 'C#', + value: 'csharp' + }, + { + text: 'C++', + value: 'cpp' + } + ]; + var customLanguages = getLanguages(editor); + return customLanguages ? customLanguages : defaultLanguages; + }; + var getCurrentLanguage = function (editor, fallback) { + var node = getSelectedCodeSample(editor); + return node.fold(function () { + return fallback; + }, function (n) { + var matches = n.className.match(/language-(\w+)/); + return matches ? matches[1] : fallback; + }); + }; + + var open = function (editor) { + var languages = getLanguages$1(editor); + var defaultLanguage = head(languages).fold(function () { + return ''; + }, function (l) { + return l.value; + }); + var currentLanguage = getCurrentLanguage(editor, defaultLanguage); + var currentCode = getCurrentCode(editor); + editor.windowManager.open({ + title: 'Insert/Edit Code Sample', + size: 'large', + body: { + type: 'panel', + items: [ + { + type: 'selectbox', + name: 'language', + label: 'Language', + items: languages + }, + { + type: 'textarea', + name: 'code', + label: 'Code view' + } + ] + }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: { + language: currentLanguage, + code: currentCode + }, + onSubmit: function (api) { + var data = api.getData(); + insertCodeSample(editor, data.language, data.code); + api.close(); + } + }); + }; + + var register = function (editor) { + editor.addCommand('codesample', function () { + var node = editor.selection.getNode(); + if (editor.selection.isCollapsed() || isCodeSample(node)) { + open(editor); + } else { + editor.formatter.toggle('code'); + } + }); + }; + + var setup = function (editor) { + var $ = editor.$; + editor.on('PreProcess', function (e) { + $('pre[contenteditable=false]', e.node).filter(trimArg(isCodeSample)).each(function (idx, elm) { + var $elm = $(elm), code = elm.textContent; + $elm.attr('class', $.trim($elm.attr('class'))); + $elm.removeAttr('contentEditable'); + $elm.empty().append($('').each(function () { + this.textContent = code; + })); + }); + }); + editor.on('SetContent', function () { + var unprocessedCodeSamples = $('pre').filter(trimArg(isCodeSample)).filter(function (idx, elm) { + return elm.contentEditable !== 'false'; + }); + if (unprocessedCodeSamples.length) { + editor.undoManager.transact(function () { + unprocessedCodeSamples.each(function (idx, elm) { + $(elm).find('br').each(function (idx, elm) { + elm.parentNode.replaceChild(editor.getDoc().createTextNode('\n'), elm); + }); + elm.contentEditable = 'false'; + elm.innerHTML = editor.dom.encode(elm.textContent); + get$1(editor).highlightElement(elm); + elm.className = $.trim(elm.className); + }); + }); + } + }); + }; + + var isCodeSampleSelection = function (editor) { + var node = editor.selection.getStart(); + return editor.dom.is(node, 'pre[class*="language-"]'); + }; + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('codesample', { + icon: 'code-sample', + tooltip: 'Insert/edit code sample', + onAction: function () { + return open(editor); + }, + onSetup: function (api) { + var nodeChangeHandler = function () { + api.setActive(isCodeSampleSelection(editor)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + } + }); + editor.ui.registry.addMenuItem('codesample', { + text: 'Code sample...', + icon: 'code-sample', + onAction: function () { + return open(editor); + } + }); + }; + + function Plugin () { + global.add('codesample', function (editor) { + setup(editor); + register$1(editor); + register(editor); + editor.on('dblclick', function (ev) { + if (isCodeSample(ev.target)) { + open(editor); + } + }); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/codesample/plugin.min.js b/src/assets/tinymce/plugins/codesample/plugin.min.js new file mode 100644 index 00000000..53f78f8a --- /dev/null +++ b/src/assets/tinymce/plugins/codesample/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e,n,t,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),s=function(e){return function(){return e}},i=s(!1),o=s(!0),a=function(){return l},l=(e=function(e){return e.isNone()},{fold:function(e,n){return e()},is:i,isSome:i,isNone:o,getOr:t=function(e){return e},getOrThunk:n=function(e){return e()},getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:s(null),getOrUndefined:s(undefined),or:t,orThunk:n,map:a,each:function(){},bind:a,exists:i,forall:o,filter:a,equals:e,equals_:e,toArray:function(){return[]},toString:s("none()")}),u=function(t){var e=s(t),n=function(){return a},r=function(e){return e(t)},a={fold:function(e,n){return n(t)},is:function(e){return t===e},isSome:o,isNone:i,getOr:e,getOrThunk:e,getOrDie:e,getOrNull:e,getOrUndefined:e,or:n,orThunk:n,map:function(e){return u(e(t))},each:function(e){e(t)},bind:r,exists:r,forall:r,filter:function(e){return e(t)?a:l},toArray:function(){return[t]},toString:function(){return"some("+t+")"},equals:function(e){return e.is(t)},equals_:function(e,n){return e.fold(i,function(e){return n(t,e)})}};return a},c={some:u,none:a,from:function(e){return null===e||e===undefined?l:u(e)}},p=function(e){return n=e,(t=0)<=t&&t>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/,number:/(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+(?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],comment:Prism.languages.c.comment,directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c["boolean"]},{}],2:[function(e,n,t){Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(?:true|false)\b/,"function":/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}},{}],3:[function(e,t,n){(function(n){(function(){var e=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,O={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function a(e){return e instanceof N?new N(e.type,a(e.content),e.alias):Array.isArray(e)?e.map(a):e.replace(/&/g,"&").replace(/=s.reach);y+=b.value.length,b=b.next){var v=b.value;if(n.length>e.length)return;if(!(v instanceof N)){var w,k,x,_,P,F,A=1;if(g&&b!=n.tail.prev){h.lastIndex=y;var S=h.exec(e);if(!S)break;var $=S.index+(d&&S[1]?S[1].length:0),j=S.index+S[0].length,E=y;for(E+=b.value.length;E<=$;)b=b.next,E+=b.value.length;if(E-=b.value.length,y=E,b.value instanceof N)continue;for(var z=b;z!==n.tail&&(Es.reach&&(s.reach=_),P=b.prev,k&&(P=B(n,P,k),y+=k.length),T(n,P,A),F=new N(i,p?O.tokenize(w,p):w,f,w),b=B(n,P,F),x&&B(n,b,x),1"+r.content+""},!u.document)return u.addEventListener&&(O.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(O.highlight(r,O.languages[t],t)),a&&u.close()},!1)),O;var e,t=O.util.currentScript();function r(){O.manual||O.highlightAll()}return t&&(O.filename=t.src,t.hasAttribute("data-manual")&&(O.manual=!0)),O.manual||("loading"===(e=document.readyState)||"interactive"===e&&t&&t.defer?document.addEventListener("DOMContentLoaded",r):window.requestAnimationFrame?window.requestAnimationFrame(r):window.setTimeout(r,16)),O}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});void 0!==t&&t.exports&&(t.exports=e),void 0!==n&&(n.Prism=e)}).call(this)}).call(this,void 0!==y?y:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],4:[function(e,n,t){var r,a;r=Prism,a=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char8_t|char16_t|char32_t|class|compl|concept|const|consteval|constexpr|constinit|const_cast|continue|co_await|co_return|co_yield|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,r.languages.cpp=r.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,function(){return a.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:a,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i,greedy:!0},operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,"boolean":/\b(?:true|false)\b/}),r.languages.insertBefore("cpp","string",{"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),r.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)(?:[^;{}"'])+?(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:r.languages.extend("cpp",{})}}),r.languages.insertBefore("inside","operator",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},r.languages.cpp["base-clause"])},{}],5:[function(e,n,t){!function(t){function r(e,t){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+t[+n]+")"})}function a(e,n,t){return RegExp(r(e,n),t||"")}function e(e,n){for(var t=0;t>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}var n="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",s="class enum interface struct",i="add alias and ascending async await by descending from get global group into join let nameof not notnull on or orderby partial remove select set unmanaged value when where where",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var u=l(s),c=RegExp(l(n+" "+s+" "+i+" "+o)),p=l(s+" "+i+" "+o),d=l(n+" "+s+" "+o),g=e(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),m=e(/\((?:[^()]|<>)*\)/.source,2),f=/@?\b[A-Za-z_]\w*\b/.source,h=r(/<<0>>(?:\s*<<1>>)?/.source,[f,g]),b=r(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[p,h]),y=/\[\s*(?:,\s*)*\]/.source,v=r(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[b,y]),w=r(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[g,m,y]),k=r(/\(<<0>>+(?:,<<0>>+)+\)/.source,[w]),x=r(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[k,b,y]),_={keyword:c,punctuation:/[<>()?,.:[\]]/},P=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,F=/"(?:\\.|[^\\"\r\n])*"/.source,A=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;t.languages.csharp=t.languages.extend("clike",{string:[{pattern:a(/(^|[^$\\])<<0>>/.source,[A]),lookbehind:!0,greedy:!0},{pattern:a(/(^|[^@$\\])<<0>>/.source,[F]),lookbehind:!0,greedy:!0},{pattern:RegExp(P),greedy:!0,alias:"character"}],"class-name":[{pattern:a(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[b]),lookbehind:!0,inside:_},{pattern:a(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[f,x]),lookbehind:!0,inside:_},{pattern:a(/(\busing\s+)<<0>>(?=\s*=)/.source,[f]),lookbehind:!0},{pattern:a(/(\b<<0>>\s+)<<1>>/.source,[u,h]),lookbehind:!0,inside:_},{pattern:a(/(\bcatch\s*\(\s*)<<0>>/.source,[b]),lookbehind:!0,inside:_},{pattern:a(/(\bwhere\s+)<<0>>/.source,[f]),lookbehind:!0},{pattern:a(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[v]),lookbehind:!0,inside:_},{pattern:a(/\b<<0>>(?=\s+(?!<<1>>)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[x,d,f]),inside:_}],keyword:c,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:ul|lu|[dflmu])?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),t.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),t.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:a(/([(,]\s*)<<0>>(?=\s*:)/.source,[f]),lookbehind:!0,alias:"punctuation"}}),t.languages.insertBefore("csharp","class-name",{namespace:{pattern:a(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[f]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:a(/(\b(?:default|typeof|sizeof)\s*\(\s*)(?:[^()\s]|\s(?!\s*\))|<<0>>)*(?=\s*\))/.source,[m]),lookbehind:!0,alias:"class-name",inside:_},"return-type":{pattern:a(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[x,b]),inside:_,alias:"class-name"},"constructor-invocation":{pattern:a(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[x]),lookbehind:!0,inside:_,alias:"class-name"},"generic-method":{pattern:a(/<<0>>\s*<<1>>(?=\s*\()/.source,[f,g]),inside:{"function":a(/^<<0>>/.source,[f]),generic:{pattern:RegExp(g),alias:"class-name",inside:_}}},"type-list":{pattern:a(/\b((?:<<0>>\s+<<1>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>)(?:\s*,\s*(?:<<3>>|<<4>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[u,h,f,x,c.source]),lookbehind:!0,inside:{keyword:c,"class-name":{pattern:RegExp(x),greedy:!0,inside:_},punctuation:/,/}},preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var S=F+"|"+P,$=r(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[S]),j=e(r(/[^"'/()]|<<0>>|\(<>*\)/.source,[$]),2),E=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,z=r(/<<0>>(?:\s*\(<<1>>*\))?/.source,[b,j]);t.languages.insertBefore("csharp","class-name",{attribute:{pattern:a(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[E,z]),lookbehind:!0,greedy:!0,inside:{target:{pattern:a(/^<<0>>(?=\s*:)/.source,[E]),alias:"keyword"},"attribute-arguments":{pattern:a(/\(<<0>>*\)/.source,[j]),inside:t.languages.csharp},"class-name":{pattern:RegExp(b),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var C=/:[^}\r\n]+/.source,O=e(r(/[^"'/()]|<<0>>|\(<>*\)/.source,[$]),2),N=r(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[O,C]),B=e(r(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[S]),2),T=r(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[B,C]);function D(e,n){return{interpolation:{pattern:a(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[e]),lookbehind:!0,inside:{"format-string":{pattern:a(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[n,C]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:t.languages.csharp}}},string:/[\s\S]+/}}t.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:a(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[N]),lookbehind:!0,greedy:!0,inside:D(N,O)},{pattern:a(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[T]),lookbehind:!0,greedy:!0,inside:D(T,B)}]})}(Prism),Prism.languages.dotnet=Prism.languages.cs=Prism.languages.csharp},{}],6:[function(e,n,t){!function(e){var n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\((?!\s*\))\s*)(?:[^()]|\((?:[^()]|\([^()]*\))*\))+?(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+n.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{"function":/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+n.source+"$"),alias:"url"}}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+n.source+")*?(?=\\s*\\{)"),string:{pattern:n,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var t=e.languages.markup;t&&(t.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:t.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:e.languages.css}},alias:"language-css"}},t.tag))}(Prism)},{}],7:[function(e,n,t){var r,a,s;r=Prism,a=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|record|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,s=/\b[A-Z](?:\w*[a-z]\w*)?\b/,r.languages.java=r.languages.extend("clike",{"class-name":[s,/\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/],keyword:a,"function":[r.languages.clike["function"],{pattern:/(\:\:)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),r.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),r.languages.insertBefore("java","class-name",{annotation:{alias:"punctuation",pattern:/(^|[^.])@\w+/,lookbehind:!0},namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,function(){return a.source})),lookbehind:!0,inside:{punctuation:/\./}},generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":s,keyword:a,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})},{}],8:[function(e,n,t){Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|(?:get|set)(?=\s*[\[$\w\xA0-\uFFFF])|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,"function":/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-flags":/[a-z]+$/,"regex-delimiter":/^\/|\/$/}},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.js=Prism.languages.javascript},{}],9:[function(e,n,t){function b(e,n){return"___"+e.toUpperCase()+n+"___"}var y;y=Prism,Object.defineProperties(y.languages["markup-templating"]={},{buildPlaceholders:{value:function(r,a,e,s){var i;r.language===a&&(i=r.tokenStack=[],r.code=r.code.replace(e,function(e){if("function"==typeof s&&!s(e))return e;for(var n,t=i.length;-1!==r.code.indexOf(n=b(a,t));)++t;return i[t]=e,n}),r.grammar=y.languages.markup)}},tokenizePlaceholders:{value:function(d,g){var m,f;d.language===g&&d.tokenStack&&(d.grammar=y.languages[g],m=0,f=Object.keys(d.tokenStack),function h(e){for(var n=0;n=f.length);n++){var t,r,a,s,i,o,l,u,c,p=e[n];"string"==typeof p||p.content&&"string"==typeof p.content?(t=f[m],r=d.tokenStack[t],a="string"==typeof p?p:p.content,s=b(g,t),-1<(i=a.indexOf(s))&&(++m,o=a.substring(0,i),l=new y.Token(g,y.tokenize(r,d.grammar),"language-"+g,r),u=a.substring(i+s.length),c=[],o&&c.push.apply(c,h([o])),c.push(l),u&&c.push.apply(c,h([u])),"string"==typeof p?e.splice.apply(e,[n,1].concat(c)):p.content=c)):p.content&&h(p.content)}return e}(d.tokens))}}})},{}],10:[function(e,n,t){Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/,name:/[^\s<>'"]+/}},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(e,n){var t={};t["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[n]},t.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:t}};r["language-"+n]={pattern:/[\s\S]+/,inside:Prism.languages[n]};var a={};a[e]={pattern:RegExp(/(<__[\s\S]*?>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:r},Prism.languages.insertBefore("markup","cdata",a)}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml},{}],11:[function(e,n,t){!function(n){n.languages.php=n.languages.extend("clike",{keyword:/\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,"boolean":{pattern:/\b(?:false|true)\b/i,alias:"constant"},constant:[/\b[A-Z_][A-Z0-9_]*\b/,/\b(?:null)\b/i],comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0}}),n.languages.insertBefore("php","string",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),n.languages.insertBefore("php","comment",{delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"}}),n.languages.insertBefore("php","keyword",{variable:/\$+(?:\w+\b|(?={))/i,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),n.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}});var e={pattern:/{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)*)/,lookbehind:!0,inside:n.languages.php};n.languages.insertBefore("php","string",{"nowdoc-string":{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},"heredoc-string":{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:e}},"single-quoted-string":{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,alias:"string",inside:{interpolation:e}}}),delete n.languages.php.string,n.hooks.add("before-tokenize",function(e){/<\?/.test(e.code)&&n.languages["markup-templating"].buildPlaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#)(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|\/\*[\s\S]*?(?:\*\/|$))*?(?:\?>|$)/gi)}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism)},{}],12:[function(e,n,t){Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},"function":{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^\s*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,"boolean":/\b(?:True|False|None)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},{}],13:[function(e,n,t){!function(e){e.languages.ruby=e.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin\s[\s\S]*?^=end/m,greedy:!0}],"class-name":{pattern:/(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/});var n={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.languages.ruby}};delete e.languages.ruby["function"],e.languages.insertBefore("ruby","keyword",{regex:[{pattern:RegExp(/%r/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1[gim]{0,3}/.source,/\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/.source,/\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/.source,/\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/.source,/<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/.source].join("|")+")"),greedy:!0,inside:{interpolation:n}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})]))/,lookbehind:!0,greedy:!0}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0},"method-definition":{pattern:/(\bdef\s+)[\w.]+/,lookbehind:!0,inside:{"function":/\w+$/,rest:e.languages.ruby}}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:RegExp(/%[qQiIwWxs]?/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S])*\)/.source,/\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S])*\]/.source,/<(?:[^<>\\]|\\[\s\S])*>/.source].join("|")+")"),greedy:!0,inside:{interpolation:n}},{pattern:/("|')(?:#\{[^}]+\}|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:n}}],e.languages.rb=e.languages.ruby}(Prism)},{}],14:[function(e,n,t){var r=e("prismjs/components/prism-core");e("prismjs/components/prism-clike"),e("prismjs/components/prism-markup-templating"),e("prismjs/components/prism-c"),e("prismjs/components/prism-cpp"),e("prismjs/components/prism-csharp"),e("prismjs/components/prism-css"),e("prismjs/components/prism-java"),e("prismjs/components/prism-javascript"),e("prismjs/components/prism-markup"),e("prismjs/components/prism-php"),e("prismjs/components/prism-python"),e("prismjs/components/prism-ruby"),n.exports={boltExport:r}},{"prismjs/components/prism-c":1,"prismjs/components/prism-clike":2,"prismjs/components/prism-core":3,"prismjs/components/prism-cpp":4,"prismjs/components/prism-csharp":5,"prismjs/components/prism-css":6,"prismjs/components/prism-java":7,"prismjs/components/prism-javascript":8,"prismjs/components/prism-markup":10,"prismjs/components/prism-markup-templating":9,"prismjs/components/prism-php":11,"prismjs/components/prism-python":12,"prismjs/components/prism-ruby":13}]},{},[14])(14)});var a=window.Prism;window.Prism=e}(undefined,h,b,undefined);var v=b.exports.boltExport,w=function(e){return f.Prism&&e.getParam("codesample_global_prismjs",!1,"boolean")?f.Prism:v},k=function(e){var n=e.selection?e.selection.getNode():null;return g(n)?c.some(n):c.none()},x=function(s){var t,e=s.getParam("codesample_languages")||[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}],n=p(e).fold(function(){return""},function(e){return e.value}),r=(t=n,k(s).fold(function(){return t},function(e){var n=e.className.match(/language-(\w+)/);return n?n[1]:t})),a=k(s).fold(function(){return""},function(e){return e.textContent});s.windowManager.open({title:"Insert/Edit Code Sample",size:"large",body:{type:"panel",items:[{type:"selectbox",name:"language",label:"Language",items:e},{type:"textarea",name:"code",label:"Code view"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{language:r,code:a},onSubmit:function(e){var n,t,r,a=e.getData();n=s,t=a.language,r=a.code,n.undoManager.transact(function(){var e=k(n);return r=d.DOM.encode(r),e.fold(function(){n.insertContent('
'+r+"
"),n.selection.select(n.$("#__new").removeAttr("id")[0])},function(e){n.dom.setAttrib(e,"class","language-"+t),e.innerHTML=r,w(n).highlightElement(e),n.selection.select(e)})}),e.close()}})},_=function(r){r.ui.registry.addToggleButton("codesample",{icon:"code-sample",tooltip:"Insert/edit code sample",onAction:function(){return x(r)},onSetup:function(t){var e=function(){var e,n;t.setActive((n=(e=r).selection.getStart(),e.dom.is(n,'pre[class*="language-"]')))};return r.on("NodeChange",e),function(){return r.off("NodeChange",e)}}}),r.ui.registry.addMenuItem("codesample",{text:"Code sample...",icon:"code-sample",onAction:function(){return x(r)}})};r.add("codesample",function(n){var t,a,r;a=(t=n).$,t.on("PreProcess",function(e){a("pre[contenteditable=false]",e.node).filter(m(g)).each(function(e,n){var t=a(n),r=n.textContent;t.attr("class",a.trim(t.attr("class"))),t.removeAttr("contentEditable"),t.empty().append(a("").each(function(){this.textContent=r}))})}),t.on("SetContent",function(){var e=a("pre").filter(m(g)).filter(function(e,n){return"false"!==n.contentEditable});e.length&&t.undoManager.transact(function(){e.each(function(e,n){a(n).find("br").each(function(e,n){n.parentNode.replaceChild(t.getDoc().createTextNode("\n"),n)}),n.contentEditable="false",n.innerHTML=t.dom.encode(n.textContent),w(t).highlightElement(n),n.className=a.trim(n.className)})})}),_(n),(r=n).addCommand("codesample",function(){var e=r.selection.getNode();r.selection.isCollapsed()||g(e)?x(r):r.formatter.toggle("code")}),n.on("dblclick",function(e){g(e.target)&&x(n)})})}(); \ No newline at end of file diff --git a/src/assets/tinymce/plugins/colorpicker/plugin.js b/src/assets/tinymce/plugins/colorpicker/plugin.js new file mode 100644 index 00000000..c8cbff2d --- /dev/null +++ b/src/assets/tinymce/plugins/colorpicker/plugin.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + function Plugin () { + global.add('colorpicker', function () { + console.warn('Color picker plugin is now built in to the core editor, please remove it from your editor configuration'); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/colorpicker/plugin.min.js b/src/assets/tinymce/plugins/colorpicker/plugin.min.js new file mode 100644 index 00000000..67519fb5 --- /dev/null +++ b/src/assets/tinymce/plugins/colorpicker/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("colorpicker",function(){console.warn("Color picker plugin is now built in to the core editor, please remove it from your editor configuration")})}(); \ No newline at end of file diff --git a/src/assets/tinymce/plugins/contextmenu/plugin.js b/src/assets/tinymce/plugins/contextmenu/plugin.js new file mode 100644 index 00000000..084e2876 --- /dev/null +++ b/src/assets/tinymce/plugins/contextmenu/plugin.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + function Plugin () { + global.add('contextmenu', function () { + console.warn('Context menu plugin is now built in to the core editor, please remove it from your editor configuration'); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/contextmenu/plugin.min.js b/src/assets/tinymce/plugins/contextmenu/plugin.min.js new file mode 100644 index 00000000..3fe1c734 --- /dev/null +++ b/src/assets/tinymce/plugins/contextmenu/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("contextmenu",function(){console.warn("Context menu plugin is now built in to the core editor, please remove it from your editor configuration")})}(); \ No newline at end of file diff --git a/src/assets/tinymce/plugins/directionality/plugin.js b/src/assets/tinymce/plugins/directionality/plugin.js new file mode 100644 index 00000000..fc9e6eb5 --- /dev/null +++ b/src/assets/tinymce/plugins/directionality/plugin.js @@ -0,0 +1,314 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var setDir = function (editor, dir) { + var dom = editor.dom; + var curDir; + var blocks = editor.selection.getSelectedBlocks(); + if (blocks.length) { + curDir = dom.getAttrib(blocks[0], 'dir'); + global$1.each(blocks, function (block) { + if (!dom.getParent(block.parentNode, '*[dir="' + dir + '"]', dom.getRoot())) { + dom.setAttrib(block, 'dir', curDir !== dir ? dir : null); + } + }); + editor.nodeChanged(); + } + }; + + var register = function (editor) { + editor.addCommand('mceDirectionLTR', function () { + setDir(editor, 'ltr'); + }); + editor.addCommand('mceDirectionRTL', function () { + setDir(editor, 'rtl'); + }); + }; + + var noop = function () { + }; + var compose1 = function (fbc, fab) { + return function (a) { + return fbc(fab(a)); + }; + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Optional = { + some: some, + none: none, + from: from + }; + + var isSimpleType = function (type) { + return function (value) { + return typeof value === type; + }; + }; + var isFunction = isSimpleType('function'); + + var isSupported = function (dom) { + return dom.style !== undefined && isFunction(dom.style.getPropertyValue); + }; + + var fromHtml = function (html, scope) { + var doc = scope || document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: node }; + }; + var fromPoint = function (docElm, x, y) { + return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); + }; + var SugarElement = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var Global = typeof window !== 'undefined' ? window : Function('return this;')(); + + var DOCUMENT = 9; + var DOCUMENT_FRAGMENT = 11; + var TEXT = 3; + + var type = function (element) { + return element.dom.nodeType; + }; + var isType = function (t) { + return function (element) { + return type(element) === t; + }; + }; + var isText = isType(TEXT); + var isDocument = isType(DOCUMENT); + var isDocumentFragment = isType(DOCUMENT_FRAGMENT); + + var owner = function (element) { + return SugarElement.fromDom(element.dom.ownerDocument); + }; + var documentOrOwner = function (dos) { + return isDocument(dos) ? dos : owner(dos); + }; + + var isShadowRoot = function (dos) { + return isDocumentFragment(dos); + }; + var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode); + var getRootNode = supported ? function (e) { + return SugarElement.fromDom(e.dom.getRootNode()); + } : documentOrOwner; + var getShadowRoot = function (e) { + var r = getRootNode(e); + return isShadowRoot(r) ? Optional.some(r) : Optional.none(); + }; + var getShadowHost = function (e) { + return SugarElement.fromDom(e.dom.host); + }; + + var inBody = function (element) { + var dom = isText(element) ? element.dom.parentNode : element.dom; + if (dom === undefined || dom === null || dom.ownerDocument === null) { + return false; + } + var doc = dom.ownerDocument; + return getShadowRoot(SugarElement.fromDom(dom)).fold(function () { + return doc.body.contains(dom); + }, compose1(inBody, getShadowHost)); + }; + + var get = function (element, property) { + var dom = element.dom; + var styles = window.getComputedStyle(dom); + var r = styles.getPropertyValue(property); + return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; + }; + var getUnsafeProperty = function (dom, property) { + return isSupported(dom) ? dom.style.getPropertyValue(property) : ''; + }; + + var getDirection = function (element) { + return get(element, 'direction') === 'rtl' ? 'rtl' : 'ltr'; + }; + + var getNodeChangeHandler = function (editor, dir) { + return function (api) { + var nodeChangeHandler = function (e) { + var element = SugarElement.fromDom(e.element); + api.setActive(getDirection(element) === dir); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }; + }; + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('ltr', { + tooltip: 'Left to right', + icon: 'ltr', + onAction: function () { + return editor.execCommand('mceDirectionLTR'); + }, + onSetup: getNodeChangeHandler(editor, 'ltr') + }); + editor.ui.registry.addToggleButton('rtl', { + tooltip: 'Right to left', + icon: 'rtl', + onAction: function () { + return editor.execCommand('mceDirectionRTL'); + }, + onSetup: getNodeChangeHandler(editor, 'rtl') + }); + }; + + function Plugin () { + global.add('directionality', function (editor) { + register(editor); + register$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/directionality/plugin.min.js b/src/assets/tinymce/plugins/directionality/plugin.min.js new file mode 100644 index 00000000..e20ec96e --- /dev/null +++ b/src/assets/tinymce/plugins/directionality/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var n,t,e,o,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=function(n,t){var e,o=n.dom,r=n.selection.getSelectedBlocks();r.length&&(e=o.getAttrib(r[0],"dir"),u.each(r,function(n){o.getParent(n.parentNode,'*[dir="'+t+'"]',o.getRoot())||o.setAttrib(n,"dir",e!==t?t:null)}),n.nodeChanged())},c=function(n){return function(){return n}},f=c(!1),d=c(!0),l=function(){return m},m=(n=function(n){return n.isNone()},{fold:function(n,t){return n()},is:f,isSome:f,isNone:d,getOr:e=function(n){return n},getOrThunk:t=function(n){return n()},getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:c(null),getOrUndefined:c(undefined),or:e,orThunk:t,map:l,each:function(){},bind:l,exists:f,forall:d,filter:l,equals:n,equals_:n,toArray:function(){return[]},toString:c("none()")}),a=function(e){var n=c(e),t=function(){return r},o=function(n){return n(e)},r={fold:function(n,t){return t(e)},is:function(n){return e===n},isSome:d,isNone:f,getOr:n,getOrThunk:n,getOrDie:n,getOrNull:n,getOrUndefined:n,or:t,orThunk:t,map:function(n){return a(n(e))},each:function(n){n(e)},bind:o,exists:o,forall:o,filter:function(n){return n(e)?r:m},toArray:function(){return[e]},toString:function(){return"some("+e+")"},equals:function(n){return n.is(e)},equals_:function(n,t){return n.fold(f,function(n){return t(e,n)})}};return r},s={some:a,none:l,from:function(n){return null===n||n===undefined?m:a(n)}},g=(o="function",function(n){return typeof n===o}),h=function(n){if(null===n||n===undefined)throw new Error("Node cannot be null or undefined");return{dom:n}},y={fromHtml:function(n,t){var e=(t||document).createElement("div");if(e.innerHTML=n,!e.hasChildNodes()||1', + fitzpatrick_scale: false, + category: "symbols" + }, + 1234: { + keywords: [ "numbers", "blue-square" ], + "char": '\ud83d\udd22', + fitzpatrick_scale: false, + category: "symbols" + }, + grinning: { + keywords: [ "face", "smile", "happy", "joy", ":D", "grin" ], + "char": '\ud83d\ude00', + fitzpatrick_scale: false, + category: "people" + }, + grimacing: { + keywords: [ "face", "grimace", "teeth" ], + "char": '\ud83d\ude2c', + fitzpatrick_scale: false, + category: "people" + }, + grin: { + keywords: [ "face", "happy", "smile", "joy", "kawaii" ], + "char": '\ud83d\ude01', + fitzpatrick_scale: false, + category: "people" + }, + joy: { + keywords: [ "face", "cry", "tears", "weep", "happy", "happytears", "haha" ], + "char": '\ud83d\ude02', + fitzpatrick_scale: false, + category: "people" + }, + rofl: { + keywords: [ "face", "rolling", "floor", "laughing", "lol", "haha" ], + "char": '\ud83e\udd23', + fitzpatrick_scale: false, + category: "people" + }, + partying: { + keywords: [ "face", "celebration", "woohoo" ], + "char": '\ud83e\udd73', + fitzpatrick_scale: false, + category: "people" + }, + smiley: { + keywords: [ "face", "happy", "joy", "haha", ":D", ":)", "smile", "funny" ], + "char": '\ud83d\ude03', + fitzpatrick_scale: false, + category: "people" + }, + smile: { + keywords: [ "face", "happy", "joy", "funny", "haha", "laugh", "like", ":D", ":)" ], + "char": '\ud83d\ude04', + fitzpatrick_scale: false, + category: "people" + }, + sweat_smile: { + keywords: [ "face", "hot", "happy", "laugh", "sweat", "smile", "relief" ], + "char": '\ud83d\ude05', + fitzpatrick_scale: false, + category: "people" + }, + laughing: { + keywords: [ "happy", "joy", "lol", "satisfied", "haha", "face", "glad", "XD", "laugh" ], + "char": '\ud83d\ude06', + fitzpatrick_scale: false, + category: "people" + }, + innocent: { + keywords: [ "face", "angel", "heaven", "halo" ], + "char": '\ud83d\ude07', + fitzpatrick_scale: false, + category: "people" + }, + wink: { + keywords: [ "face", "happy", "mischievous", "secret", ";)", "smile", "eye" ], + "char": '\ud83d\ude09', + fitzpatrick_scale: false, + category: "people" + }, + blush: { + keywords: [ "face", "smile", "happy", "flushed", "crush", "embarrassed", "shy", "joy" ], + "char": '\ud83d\ude0a', + fitzpatrick_scale: false, + category: "people" + }, + slightly_smiling_face: { + keywords: [ "face", "smile" ], + "char": '\ud83d\ude42', + fitzpatrick_scale: false, + category: "people" + }, + upside_down_face: { + keywords: [ "face", "flipped", "silly", "smile" ], + "char": '\ud83d\ude43', + fitzpatrick_scale: false, + category: "people" + }, + relaxed: { + keywords: [ "face", "blush", "massage", "happiness" ], + "char": '\u263a\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + yum: { + keywords: [ "happy", "joy", "tongue", "smile", "face", "silly", "yummy", "nom", "delicious", "savouring" ], + "char": '\ud83d\ude0b', + fitzpatrick_scale: false, + category: "people" + }, + relieved: { + keywords: [ "face", "relaxed", "phew", "massage", "happiness" ], + "char": '\ud83d\ude0c', + fitzpatrick_scale: false, + category: "people" + }, + heart_eyes: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "heart" ], + "char": '\ud83d\ude0d', + fitzpatrick_scale: false, + category: "people" + }, + smiling_face_with_three_hearts: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "hearts", "adore" ], + "char": '\ud83e\udd70', + fitzpatrick_scale: false, + category: "people" + }, + kissing_heart: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ], + "char": '\ud83d\ude18', + fitzpatrick_scale: false, + category: "people" + }, + kissing: { + keywords: [ "love", "like", "face", "3", "valentines", "infatuation", "kiss" ], + "char": '\ud83d\ude17', + fitzpatrick_scale: false, + category: "people" + }, + kissing_smiling_eyes: { + keywords: [ "face", "affection", "valentines", "infatuation", "kiss" ], + "char": '\ud83d\ude19', + fitzpatrick_scale: false, + category: "people" + }, + kissing_closed_eyes: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ], + "char": '\ud83d\ude1a', + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue_winking_eye: { + keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "wink", "tongue" ], + "char": '\ud83d\ude1c', + fitzpatrick_scale: false, + category: "people" + }, + zany: { + keywords: [ "face", "goofy", "crazy" ], + "char": '\ud83e\udd2a', + fitzpatrick_scale: false, + category: "people" + }, + raised_eyebrow: { + keywords: [ "face", "distrust", "scepticism", "disapproval", "disbelief", "surprise" ], + "char": '\ud83e\udd28', + fitzpatrick_scale: false, + category: "people" + }, + monocle: { + keywords: [ "face", "stuffy", "wealthy" ], + "char": '\ud83e\uddd0', + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue_closed_eyes: { + keywords: [ "face", "prank", "playful", "mischievous", "smile", "tongue" ], + "char": '\ud83d\ude1d', + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue: { + keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "tongue" ], + "char": '\ud83d\ude1b', + fitzpatrick_scale: false, + category: "people" + }, + money_mouth_face: { + keywords: [ "face", "rich", "dollar", "money" ], + "char": '\ud83e\udd11', + fitzpatrick_scale: false, + category: "people" + }, + nerd_face: { + keywords: [ "face", "nerdy", "geek", "dork" ], + "char": '\ud83e\udd13', + fitzpatrick_scale: false, + category: "people" + }, + sunglasses: { + keywords: [ "face", "cool", "smile", "summer", "beach", "sunglass" ], + "char": '\ud83d\ude0e', + fitzpatrick_scale: false, + category: "people" + }, + star_struck: { + keywords: [ "face", "smile", "starry", "eyes", "grinning" ], + "char": '\ud83e\udd29', + fitzpatrick_scale: false, + category: "people" + }, + clown_face: { + keywords: [ "face" ], + "char": '\ud83e\udd21', + fitzpatrick_scale: false, + category: "people" + }, + cowboy_hat_face: { + keywords: [ "face", "cowgirl", "hat" ], + "char": '\ud83e\udd20', + fitzpatrick_scale: false, + category: "people" + }, + hugs: { + keywords: [ "face", "smile", "hug" ], + "char": '\ud83e\udd17', + fitzpatrick_scale: false, + category: "people" + }, + smirk: { + keywords: [ "face", "smile", "mean", "prank", "smug", "sarcasm" ], + "char": '\ud83d\ude0f', + fitzpatrick_scale: false, + category: "people" + }, + no_mouth: { + keywords: [ "face", "hellokitty" ], + "char": '\ud83d\ude36', + fitzpatrick_scale: false, + category: "people" + }, + neutral_face: { + keywords: [ "indifference", "meh", ":|", "neutral" ], + "char": '\ud83d\ude10', + fitzpatrick_scale: false, + category: "people" + }, + expressionless: { + keywords: [ "face", "indifferent", "-_-", "meh", "deadpan" ], + "char": '\ud83d\ude11', + fitzpatrick_scale: false, + category: "people" + }, + unamused: { + keywords: [ "indifference", "bored", "straight face", "serious", "sarcasm", "unimpressed", "skeptical", "dubious", "side_eye" ], + "char": '\ud83d\ude12', + fitzpatrick_scale: false, + category: "people" + }, + roll_eyes: { + keywords: [ "face", "eyeroll", "frustrated" ], + "char": '\ud83d\ude44', + fitzpatrick_scale: false, + category: "people" + }, + thinking: { + keywords: [ "face", "hmmm", "think", "consider" ], + "char": '\ud83e\udd14', + fitzpatrick_scale: false, + category: "people" + }, + lying_face: { + keywords: [ "face", "lie", "pinocchio" ], + "char": '\ud83e\udd25', + fitzpatrick_scale: false, + category: "people" + }, + hand_over_mouth: { + keywords: [ "face", "whoops", "shock", "surprise" ], + "char": '\ud83e\udd2d', + fitzpatrick_scale: false, + category: "people" + }, + shushing: { + keywords: [ "face", "quiet", "shhh" ], + "char": '\ud83e\udd2b', + fitzpatrick_scale: false, + category: "people" + }, + symbols_over_mouth: { + keywords: [ "face", "swearing", "cursing", "cussing", "profanity", "expletive" ], + "char": '\ud83e\udd2c', + fitzpatrick_scale: false, + category: "people" + }, + exploding_head: { + keywords: [ "face", "shocked", "mind", "blown" ], + "char": '\ud83e\udd2f', + fitzpatrick_scale: false, + category: "people" + }, + flushed: { + keywords: [ "face", "blush", "shy", "flattered" ], + "char": '\ud83d\ude33', + fitzpatrick_scale: false, + category: "people" + }, + disappointed: { + keywords: [ "face", "sad", "upset", "depressed", ":(" ], + "char": '\ud83d\ude1e', + fitzpatrick_scale: false, + category: "people" + }, + worried: { + keywords: [ "face", "concern", "nervous", ":(" ], + "char": '\ud83d\ude1f', + fitzpatrick_scale: false, + category: "people" + }, + angry: { + keywords: [ "mad", "face", "annoyed", "frustrated" ], + "char": '\ud83d\ude20', + fitzpatrick_scale: false, + category: "people" + }, + rage: { + keywords: [ "angry", "mad", "hate", "despise" ], + "char": '\ud83d\ude21', + fitzpatrick_scale: false, + category: "people" + }, + pensive: { + keywords: [ "face", "sad", "depressed", "upset" ], + "char": '\ud83d\ude14', + fitzpatrick_scale: false, + category: "people" + }, + confused: { + keywords: [ "face", "indifference", "huh", "weird", "hmmm", ":/" ], + "char": '\ud83d\ude15', + fitzpatrick_scale: false, + category: "people" + }, + slightly_frowning_face: { + keywords: [ "face", "frowning", "disappointed", "sad", "upset" ], + "char": '\ud83d\ude41', + fitzpatrick_scale: false, + category: "people" + }, + frowning_face: { + keywords: [ "face", "sad", "upset", "frown" ], + "char": '\u2639', + fitzpatrick_scale: false, + category: "people" + }, + persevere: { + keywords: [ "face", "sick", "no", "upset", "oops" ], + "char": '\ud83d\ude23', + fitzpatrick_scale: false, + category: "people" + }, + confounded: { + keywords: [ "face", "confused", "sick", "unwell", "oops", ":S" ], + "char": '\ud83d\ude16', + fitzpatrick_scale: false, + category: "people" + }, + tired_face: { + keywords: [ "sick", "whine", "upset", "frustrated" ], + "char": '\ud83d\ude2b', + fitzpatrick_scale: false, + category: "people" + }, + weary: { + keywords: [ "face", "tired", "sleepy", "sad", "frustrated", "upset" ], + "char": '\ud83d\ude29', + fitzpatrick_scale: false, + category: "people" + }, + pleading: { + keywords: [ "face", "begging", "mercy" ], + "char": '\ud83e\udd7a', + fitzpatrick_scale: false, + category: "people" + }, + triumph: { + keywords: [ "face", "gas", "phew", "proud", "pride" ], + "char": '\ud83d\ude24', + fitzpatrick_scale: false, + category: "people" + }, + open_mouth: { + keywords: [ "face", "surprise", "impressed", "wow", "whoa", ":O" ], + "char": '\ud83d\ude2e', + fitzpatrick_scale: false, + category: "people" + }, + scream: { + keywords: [ "face", "munch", "scared", "omg" ], + "char": '\ud83d\ude31', + fitzpatrick_scale: false, + category: "people" + }, + fearful: { + keywords: [ "face", "scared", "terrified", "nervous", "oops", "huh" ], + "char": '\ud83d\ude28', + fitzpatrick_scale: false, + category: "people" + }, + cold_sweat: { + keywords: [ "face", "nervous", "sweat" ], + "char": '\ud83d\ude30', + fitzpatrick_scale: false, + category: "people" + }, + hushed: { + keywords: [ "face", "woo", "shh" ], + "char": '\ud83d\ude2f', + fitzpatrick_scale: false, + category: "people" + }, + frowning: { + keywords: [ "face", "aw", "what" ], + "char": '\ud83d\ude26', + fitzpatrick_scale: false, + category: "people" + }, + anguished: { + keywords: [ "face", "stunned", "nervous" ], + "char": '\ud83d\ude27', + fitzpatrick_scale: false, + category: "people" + }, + cry: { + keywords: [ "face", "tears", "sad", "depressed", "upset", ":'(" ], + "char": '\ud83d\ude22', + fitzpatrick_scale: false, + category: "people" + }, + disappointed_relieved: { + keywords: [ "face", "phew", "sweat", "nervous" ], + "char": '\ud83d\ude25', + fitzpatrick_scale: false, + category: "people" + }, + drooling_face: { + keywords: [ "face" ], + "char": '\ud83e\udd24', + fitzpatrick_scale: false, + category: "people" + }, + sleepy: { + keywords: [ "face", "tired", "rest", "nap" ], + "char": '\ud83d\ude2a', + fitzpatrick_scale: false, + category: "people" + }, + sweat: { + keywords: [ "face", "hot", "sad", "tired", "exercise" ], + "char": '\ud83d\ude13', + fitzpatrick_scale: false, + category: "people" + }, + hot: { + keywords: [ "face", "feverish", "heat", "red", "sweating" ], + "char": '\ud83e\udd75', + fitzpatrick_scale: false, + category: "people" + }, + cold: { + keywords: [ "face", "blue", "freezing", "frozen", "frostbite", "icicles" ], + "char": '\ud83e\udd76', + fitzpatrick_scale: false, + category: "people" + }, + sob: { + keywords: [ "face", "cry", "tears", "sad", "upset", "depressed" ], + "char": '\ud83d\ude2d', + fitzpatrick_scale: false, + category: "people" + }, + dizzy_face: { + keywords: [ "spent", "unconscious", "xox", "dizzy" ], + "char": '\ud83d\ude35', + fitzpatrick_scale: false, + category: "people" + }, + astonished: { + keywords: [ "face", "xox", "surprised", "poisoned" ], + "char": '\ud83d\ude32', + fitzpatrick_scale: false, + category: "people" + }, + zipper_mouth_face: { + keywords: [ "face", "sealed", "zipper", "secret" ], + "char": '\ud83e\udd10', + fitzpatrick_scale: false, + category: "people" + }, + nauseated_face: { + keywords: [ "face", "vomit", "gross", "green", "sick", "throw up", "ill" ], + "char": '\ud83e\udd22', + fitzpatrick_scale: false, + category: "people" + }, + sneezing_face: { + keywords: [ "face", "gesundheit", "sneeze", "sick", "allergy" ], + "char": '\ud83e\udd27', + fitzpatrick_scale: false, + category: "people" + }, + vomiting: { + keywords: [ "face", "sick" ], + "char": '\ud83e\udd2e', + fitzpatrick_scale: false, + category: "people" + }, + mask: { + keywords: [ "face", "sick", "ill", "disease" ], + "char": '\ud83d\ude37', + fitzpatrick_scale: false, + category: "people" + }, + face_with_thermometer: { + keywords: [ "sick", "temperature", "thermometer", "cold", "fever" ], + "char": '\ud83e\udd12', + fitzpatrick_scale: false, + category: "people" + }, + face_with_head_bandage: { + keywords: [ "injured", "clumsy", "bandage", "hurt" ], + "char": '\ud83e\udd15', + fitzpatrick_scale: false, + category: "people" + }, + woozy: { + keywords: [ "face", "dizzy", "intoxicated", "tipsy", "wavy" ], + "char": '\ud83e\udd74', + fitzpatrick_scale: false, + category: "people" + }, + sleeping: { + keywords: [ "face", "tired", "sleepy", "night", "zzz" ], + "char": '\ud83d\ude34', + fitzpatrick_scale: false, + category: "people" + }, + zzz: { + keywords: [ "sleepy", "tired", "dream" ], + "char": '\ud83d\udca4', + fitzpatrick_scale: false, + category: "people" + }, + poop: { + keywords: [ "hankey", "shitface", "fail", "turd", "shit" ], + "char": '\ud83d\udca9', + fitzpatrick_scale: false, + category: "people" + }, + smiling_imp: { + keywords: [ "devil", "horns" ], + "char": '\ud83d\ude08', + fitzpatrick_scale: false, + category: "people" + }, + imp: { + keywords: [ "devil", "angry", "horns" ], + "char": '\ud83d\udc7f', + fitzpatrick_scale: false, + category: "people" + }, + japanese_ogre: { + keywords: [ "monster", "red", "mask", "halloween", "scary", "creepy", "devil", "demon", "japanese", "ogre" ], + "char": '\ud83d\udc79', + fitzpatrick_scale: false, + category: "people" + }, + japanese_goblin: { + keywords: [ "red", "evil", "mask", "monster", "scary", "creepy", "japanese", "goblin" ], + "char": '\ud83d\udc7a', + fitzpatrick_scale: false, + category: "people" + }, + skull: { + keywords: [ "dead", "skeleton", "creepy", "death" ], + "char": '\ud83d\udc80', + fitzpatrick_scale: false, + category: "people" + }, + ghost: { + keywords: [ "halloween", "spooky", "scary" ], + "char": '\ud83d\udc7b', + fitzpatrick_scale: false, + category: "people" + }, + alien: { + keywords: [ "UFO", "paul", "weird", "outer_space" ], + "char": '\ud83d\udc7d', + fitzpatrick_scale: false, + category: "people" + }, + robot: { + keywords: [ "computer", "machine", "bot" ], + "char": '\ud83e\udd16', + fitzpatrick_scale: false, + category: "people" + }, + smiley_cat: { + keywords: [ "animal", "cats", "happy", "smile" ], + "char": '\ud83d\ude3a', + fitzpatrick_scale: false, + category: "people" + }, + smile_cat: { + keywords: [ "animal", "cats", "smile" ], + "char": '\ud83d\ude38', + fitzpatrick_scale: false, + category: "people" + }, + joy_cat: { + keywords: [ "animal", "cats", "haha", "happy", "tears" ], + "char": '\ud83d\ude39', + fitzpatrick_scale: false, + category: "people" + }, + heart_eyes_cat: { + keywords: [ "animal", "love", "like", "affection", "cats", "valentines", "heart" ], + "char": '\ud83d\ude3b', + fitzpatrick_scale: false, + category: "people" + }, + smirk_cat: { + keywords: [ "animal", "cats", "smirk" ], + "char": '\ud83d\ude3c', + fitzpatrick_scale: false, + category: "people" + }, + kissing_cat: { + keywords: [ "animal", "cats", "kiss" ], + "char": '\ud83d\ude3d', + fitzpatrick_scale: false, + category: "people" + }, + scream_cat: { + keywords: [ "animal", "cats", "munch", "scared", "scream" ], + "char": '\ud83d\ude40', + fitzpatrick_scale: false, + category: "people" + }, + crying_cat_face: { + keywords: [ "animal", "tears", "weep", "sad", "cats", "upset", "cry" ], + "char": '\ud83d\ude3f', + fitzpatrick_scale: false, + category: "people" + }, + pouting_cat: { + keywords: [ "animal", "cats" ], + "char": '\ud83d\ude3e', + fitzpatrick_scale: false, + category: "people" + }, + palms_up: { + keywords: [ "hands", "gesture", "cupped", "prayer" ], + "char": '\ud83e\udd32', + fitzpatrick_scale: true, + category: "people" + }, + raised_hands: { + keywords: [ "gesture", "hooray", "yea", "celebration", "hands" ], + "char": '\ud83d\ude4c', + fitzpatrick_scale: true, + category: "people" + }, + clap: { + keywords: [ "hands", "praise", "applause", "congrats", "yay" ], + "char": '\ud83d\udc4f', + fitzpatrick_scale: true, + category: "people" + }, + wave: { + keywords: [ "hands", "gesture", "goodbye", "solong", "farewell", "hello", "hi", "palm" ], + "char": '\ud83d\udc4b', + fitzpatrick_scale: true, + category: "people" + }, + call_me_hand: { + keywords: [ "hands", "gesture" ], + "char": '\ud83e\udd19', + fitzpatrick_scale: true, + category: "people" + }, + "+1": { + keywords: [ "thumbsup", "yes", "awesome", "good", "agree", "accept", "cool", "hand", "like" ], + "char": '\ud83d\udc4d', + fitzpatrick_scale: true, + category: "people" + }, + "-1": { + keywords: [ "thumbsdown", "no", "dislike", "hand" ], + "char": '\ud83d\udc4e', + fitzpatrick_scale: true, + category: "people" + }, + facepunch: { + keywords: [ "angry", "violence", "fist", "hit", "attack", "hand" ], + "char": '\ud83d\udc4a', + fitzpatrick_scale: true, + category: "people" + }, + fist: { + keywords: [ "fingers", "hand", "grasp" ], + "char": '\u270a', + fitzpatrick_scale: true, + category: "people" + }, + fist_left: { + keywords: [ "hand", "fistbump" ], + "char": '\ud83e\udd1b', + fitzpatrick_scale: true, + category: "people" + }, + fist_right: { + keywords: [ "hand", "fistbump" ], + "char": '\ud83e\udd1c', + fitzpatrick_scale: true, + category: "people" + }, + v: { + keywords: [ "fingers", "ohyeah", "hand", "peace", "victory", "two" ], + "char": '\u270c', + fitzpatrick_scale: true, + category: "people" + }, + ok_hand: { + keywords: [ "fingers", "limbs", "perfect", "ok", "okay" ], + "char": '\ud83d\udc4c', + fitzpatrick_scale: true, + category: "people" + }, + raised_hand: { + keywords: [ "fingers", "stop", "highfive", "palm", "ban" ], + "char": '\u270b', + fitzpatrick_scale: true, + category: "people" + }, + raised_back_of_hand: { + keywords: [ "fingers", "raised", "backhand" ], + "char": '\ud83e\udd1a', + fitzpatrick_scale: true, + category: "people" + }, + open_hands: { + keywords: [ "fingers", "butterfly", "hands", "open" ], + "char": '\ud83d\udc50', + fitzpatrick_scale: true, + category: "people" + }, + muscle: { + keywords: [ "arm", "flex", "hand", "summer", "strong", "biceps" ], + "char": '\ud83d\udcaa', + fitzpatrick_scale: true, + category: "people" + }, + pray: { + keywords: [ "please", "hope", "wish", "namaste", "highfive" ], + "char": '\ud83d\ude4f', + fitzpatrick_scale: true, + category: "people" + }, + foot: { + keywords: [ "kick", "stomp" ], + "char": '\ud83e\uddb6', + fitzpatrick_scale: true, + category: "people" + }, + leg: { + keywords: [ "kick", "limb" ], + "char": '\ud83e\uddb5', + fitzpatrick_scale: true, + category: "people" + }, + handshake: { + keywords: [ "agreement", "shake" ], + "char": '\ud83e\udd1d', + fitzpatrick_scale: false, + category: "people" + }, + point_up: { + keywords: [ "hand", "fingers", "direction", "up" ], + "char": '\u261d', + fitzpatrick_scale: true, + category: "people" + }, + point_up_2: { + keywords: [ "fingers", "hand", "direction", "up" ], + "char": '\ud83d\udc46', + fitzpatrick_scale: true, + category: "people" + }, + point_down: { + keywords: [ "fingers", "hand", "direction", "down" ], + "char": '\ud83d\udc47', + fitzpatrick_scale: true, + category: "people" + }, + point_left: { + keywords: [ "direction", "fingers", "hand", "left" ], + "char": '\ud83d\udc48', + fitzpatrick_scale: true, + category: "people" + }, + point_right: { + keywords: [ "fingers", "hand", "direction", "right" ], + "char": '\ud83d\udc49', + fitzpatrick_scale: true, + category: "people" + }, + fu: { + keywords: [ "hand", "fingers", "rude", "middle", "flipping" ], + "char": '\ud83d\udd95', + fitzpatrick_scale: true, + category: "people" + }, + raised_hand_with_fingers_splayed: { + keywords: [ "hand", "fingers", "palm" ], + "char": '\ud83d\udd90', + fitzpatrick_scale: true, + category: "people" + }, + love_you: { + keywords: [ "hand", "fingers", "gesture" ], + "char": '\ud83e\udd1f', + fitzpatrick_scale: true, + category: "people" + }, + metal: { + keywords: [ "hand", "fingers", "evil_eye", "sign_of_horns", "rock_on" ], + "char": '\ud83e\udd18', + fitzpatrick_scale: true, + category: "people" + }, + crossed_fingers: { + keywords: [ "good", "lucky" ], + "char": '\ud83e\udd1e', + fitzpatrick_scale: true, + category: "people" + }, + vulcan_salute: { + keywords: [ "hand", "fingers", "spock", "star trek" ], + "char": '\ud83d\udd96', + fitzpatrick_scale: true, + category: "people" + }, + writing_hand: { + keywords: [ "lower_left_ballpoint_pen", "stationery", "write", "compose" ], + "char": '\u270d', + fitzpatrick_scale: true, + category: "people" + }, + selfie: { + keywords: [ "camera", "phone" ], + "char": '\ud83e\udd33', + fitzpatrick_scale: true, + category: "people" + }, + nail_care: { + keywords: [ "beauty", "manicure", "finger", "fashion", "nail" ], + "char": '\ud83d\udc85', + fitzpatrick_scale: true, + category: "people" + }, + lips: { + keywords: [ "mouth", "kiss" ], + "char": '\ud83d\udc44', + fitzpatrick_scale: false, + category: "people" + }, + tooth: { + keywords: [ "teeth", "dentist" ], + "char": '\ud83e\uddb7', + fitzpatrick_scale: false, + category: "people" + }, + tongue: { + keywords: [ "mouth", "playful" ], + "char": '\ud83d\udc45', + fitzpatrick_scale: false, + category: "people" + }, + ear: { + keywords: [ "face", "hear", "sound", "listen" ], + "char": '\ud83d\udc42', + fitzpatrick_scale: true, + category: "people" + }, + nose: { + keywords: [ "smell", "sniff" ], + "char": '\ud83d\udc43', + fitzpatrick_scale: true, + category: "people" + }, + eye: { + keywords: [ "face", "look", "see", "watch", "stare" ], + "char": '\ud83d\udc41', + fitzpatrick_scale: false, + category: "people" + }, + eyes: { + keywords: [ "look", "watch", "stalk", "peek", "see" ], + "char": '\ud83d\udc40', + fitzpatrick_scale: false, + category: "people" + }, + brain: { + keywords: [ "smart", "intelligent" ], + "char": '\ud83e\udde0', + fitzpatrick_scale: false, + category: "people" + }, + bust_in_silhouette: { + keywords: [ "user", "person", "human" ], + "char": '\ud83d\udc64', + fitzpatrick_scale: false, + category: "people" + }, + busts_in_silhouette: { + keywords: [ "user", "person", "human", "group", "team" ], + "char": '\ud83d\udc65', + fitzpatrick_scale: false, + category: "people" + }, + speaking_head: { + keywords: [ "user", "person", "human", "sing", "say", "talk" ], + "char": '\ud83d\udde3', + fitzpatrick_scale: false, + category: "people" + }, + baby: { + keywords: [ "child", "boy", "girl", "toddler" ], + "char": '\ud83d\udc76', + fitzpatrick_scale: true, + category: "people" + }, + child: { + keywords: [ "gender-neutral", "young" ], + "char": '\ud83e\uddd2', + fitzpatrick_scale: true, + category: "people" + }, + boy: { + keywords: [ "man", "male", "guy", "teenager" ], + "char": '\ud83d\udc66', + fitzpatrick_scale: true, + category: "people" + }, + girl: { + keywords: [ "female", "woman", "teenager" ], + "char": '\ud83d\udc67', + fitzpatrick_scale: true, + category: "people" + }, + adult: { + keywords: [ "gender-neutral", "person" ], + "char": '\ud83e\uddd1', + fitzpatrick_scale: true, + category: "people" + }, + man: { + keywords: [ "mustache", "father", "dad", "guy", "classy", "sir", "moustache" ], + "char": '\ud83d\udc68', + fitzpatrick_scale: true, + category: "people" + }, + woman: { + keywords: [ "female", "girls", "lady" ], + "char": '\ud83d\udc69', + fitzpatrick_scale: true, + category: "people" + }, + blonde_woman: { + keywords: [ "woman", "female", "girl", "blonde", "person" ], + "char": '\ud83d\udc71\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + blonde_man: { + keywords: [ "man", "male", "boy", "blonde", "guy", "person" ], + "char": '\ud83d\udc71', + fitzpatrick_scale: true, + category: "people" + }, + bearded_person: { + keywords: [ "person", "bewhiskered" ], + "char": '\ud83e\uddd4', + fitzpatrick_scale: true, + category: "people" + }, + older_adult: { + keywords: [ "human", "elder", "senior", "gender-neutral" ], + "char": '\ud83e\uddd3', + fitzpatrick_scale: true, + category: "people" + }, + older_man: { + keywords: [ "human", "male", "men", "old", "elder", "senior" ], + "char": '\ud83d\udc74', + fitzpatrick_scale: true, + category: "people" + }, + older_woman: { + keywords: [ "human", "female", "women", "lady", "old", "elder", "senior" ], + "char": '\ud83d\udc75', + fitzpatrick_scale: true, + category: "people" + }, + man_with_gua_pi_mao: { + keywords: [ "male", "boy", "chinese" ], + "char": '\ud83d\udc72', + fitzpatrick_scale: true, + category: "people" + }, + woman_with_headscarf: { + keywords: [ "female", "hijab", "mantilla", "tichel" ], + "char": '\ud83e\uddd5', + fitzpatrick_scale: true, + category: "people" + }, + woman_with_turban: { + keywords: [ "female", "indian", "hinduism", "arabs", "woman" ], + "char": '\ud83d\udc73\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_with_turban: { + keywords: [ "male", "indian", "hinduism", "arabs" ], + "char": '\ud83d\udc73', + fitzpatrick_scale: true, + category: "people" + }, + policewoman: { + keywords: [ "woman", "police", "law", "legal", "enforcement", "arrest", "911", "female" ], + "char": '\ud83d\udc6e\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + policeman: { + keywords: [ "man", "police", "law", "legal", "enforcement", "arrest", "911" ], + "char": '\ud83d\udc6e', + fitzpatrick_scale: true, + category: "people" + }, + construction_worker_woman: { + keywords: [ "female", "human", "wip", "build", "construction", "worker", "labor", "woman" ], + "char": '\ud83d\udc77\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + construction_worker_man: { + keywords: [ "male", "human", "wip", "guy", "build", "construction", "worker", "labor" ], + "char": '\ud83d\udc77', + fitzpatrick_scale: true, + category: "people" + }, + guardswoman: { + keywords: [ "uk", "gb", "british", "female", "royal", "woman" ], + "char": '\ud83d\udc82\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + guardsman: { + keywords: [ "uk", "gb", "british", "male", "guy", "royal" ], + "char": '\ud83d\udc82', + fitzpatrick_scale: true, + category: "people" + }, + female_detective: { + keywords: [ "human", "spy", "detective", "female", "woman" ], + "char": '\ud83d\udd75\ufe0f\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + male_detective: { + keywords: [ "human", "spy", "detective" ], + "char": '\ud83d\udd75', + fitzpatrick_scale: true, + category: "people" + }, + woman_health_worker: { + keywords: [ "doctor", "nurse", "therapist", "healthcare", "woman", "human" ], + "char": '\ud83d\udc69\u200d\u2695\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_health_worker: { + keywords: [ "doctor", "nurse", "therapist", "healthcare", "man", "human" ], + "char": '\ud83d\udc68\u200d\u2695\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_farmer: { + keywords: [ "rancher", "gardener", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83c\udf3e', + fitzpatrick_scale: true, + category: "people" + }, + man_farmer: { + keywords: [ "rancher", "gardener", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83c\udf3e', + fitzpatrick_scale: true, + category: "people" + }, + woman_cook: { + keywords: [ "chef", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83c\udf73', + fitzpatrick_scale: true, + category: "people" + }, + man_cook: { + keywords: [ "chef", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83c\udf73', + fitzpatrick_scale: true, + category: "people" + }, + woman_student: { + keywords: [ "graduate", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83c\udf93', + fitzpatrick_scale: true, + category: "people" + }, + man_student: { + keywords: [ "graduate", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83c\udf93', + fitzpatrick_scale: true, + category: "people" + }, + woman_singer: { + keywords: [ "rockstar", "entertainer", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83c\udfa4', + fitzpatrick_scale: true, + category: "people" + }, + man_singer: { + keywords: [ "rockstar", "entertainer", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83c\udfa4', + fitzpatrick_scale: true, + category: "people" + }, + woman_teacher: { + keywords: [ "instructor", "professor", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83c\udfeb', + fitzpatrick_scale: true, + category: "people" + }, + man_teacher: { + keywords: [ "instructor", "professor", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83c\udfeb', + fitzpatrick_scale: true, + category: "people" + }, + woman_factory_worker: { + keywords: [ "assembly", "industrial", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83c\udfed', + fitzpatrick_scale: true, + category: "people" + }, + man_factory_worker: { + keywords: [ "assembly", "industrial", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83c\udfed', + fitzpatrick_scale: true, + category: "people" + }, + woman_technologist: { + keywords: [ "coder", "developer", "engineer", "programmer", "software", "woman", "human", "laptop", "computer" ], + "char": '\ud83d\udc69\u200d\ud83d\udcbb', + fitzpatrick_scale: true, + category: "people" + }, + man_technologist: { + keywords: [ "coder", "developer", "engineer", "programmer", "software", "man", "human", "laptop", "computer" ], + "char": '\ud83d\udc68\u200d\ud83d\udcbb', + fitzpatrick_scale: true, + category: "people" + }, + woman_office_worker: { + keywords: [ "business", "manager", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83d\udcbc', + fitzpatrick_scale: true, + category: "people" + }, + man_office_worker: { + keywords: [ "business", "manager", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83d\udcbc', + fitzpatrick_scale: true, + category: "people" + }, + woman_mechanic: { + keywords: [ "plumber", "woman", "human", "wrench" ], + "char": '\ud83d\udc69\u200d\ud83d\udd27', + fitzpatrick_scale: true, + category: "people" + }, + man_mechanic: { + keywords: [ "plumber", "man", "human", "wrench" ], + "char": '\ud83d\udc68\u200d\ud83d\udd27', + fitzpatrick_scale: true, + category: "people" + }, + woman_scientist: { + keywords: [ "biologist", "chemist", "engineer", "physicist", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83d\udd2c', + fitzpatrick_scale: true, + category: "people" + }, + man_scientist: { + keywords: [ "biologist", "chemist", "engineer", "physicist", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83d\udd2c', + fitzpatrick_scale: true, + category: "people" + }, + woman_artist: { + keywords: [ "painter", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83c\udfa8', + fitzpatrick_scale: true, + category: "people" + }, + man_artist: { + keywords: [ "painter", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83c\udfa8', + fitzpatrick_scale: true, + category: "people" + }, + woman_firefighter: { + keywords: [ "fireman", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83d\ude92', + fitzpatrick_scale: true, + category: "people" + }, + man_firefighter: { + keywords: [ "fireman", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83d\ude92', + fitzpatrick_scale: true, + category: "people" + }, + woman_pilot: { + keywords: [ "aviator", "plane", "woman", "human" ], + "char": '\ud83d\udc69\u200d\u2708\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_pilot: { + keywords: [ "aviator", "plane", "man", "human" ], + "char": '\ud83d\udc68\u200d\u2708\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_astronaut: { + keywords: [ "space", "rocket", "woman", "human" ], + "char": '\ud83d\udc69\u200d\ud83d\ude80', + fitzpatrick_scale: true, + category: "people" + }, + man_astronaut: { + keywords: [ "space", "rocket", "man", "human" ], + "char": '\ud83d\udc68\u200d\ud83d\ude80', + fitzpatrick_scale: true, + category: "people" + }, + woman_judge: { + keywords: [ "justice", "court", "woman", "human" ], + "char": '\ud83d\udc69\u200d\u2696\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_judge: { + keywords: [ "justice", "court", "man", "human" ], + "char": '\ud83d\udc68\u200d\u2696\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_superhero: { + keywords: [ "woman", "female", "good", "heroine", "superpowers" ], + "char": '\ud83e\uddb8\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_superhero: { + keywords: [ "man", "male", "good", "hero", "superpowers" ], + "char": '\ud83e\uddb8\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_supervillain: { + keywords: [ "woman", "female", "evil", "bad", "criminal", "heroine", "superpowers" ], + "char": '\ud83e\uddb9\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_supervillain: { + keywords: [ "man", "male", "evil", "bad", "criminal", "hero", "superpowers" ], + "char": '\ud83e\uddb9\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + mrs_claus: { + keywords: [ "woman", "female", "xmas", "mother christmas" ], + "char": '\ud83e\udd36', + fitzpatrick_scale: true, + category: "people" + }, + santa: { + keywords: [ "festival", "man", "male", "xmas", "father christmas" ], + "char": '\ud83c\udf85', + fitzpatrick_scale: true, + category: "people" + }, + sorceress: { + keywords: [ "woman", "female", "mage", "witch" ], + "char": '\ud83e\uddd9\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + wizard: { + keywords: [ "man", "male", "mage", "sorcerer" ], + "char": '\ud83e\uddd9\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_elf: { + keywords: [ "woman", "female" ], + "char": '\ud83e\udddd\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_elf: { + keywords: [ "man", "male" ], + "char": '\ud83e\udddd\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_vampire: { + keywords: [ "woman", "female" ], + "char": '\ud83e\udddb\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_vampire: { + keywords: [ "man", "male", "dracula" ], + "char": '\ud83e\udddb\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_zombie: { + keywords: [ "woman", "female", "undead", "walking dead" ], + "char": '\ud83e\udddf\u200d\u2640\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + man_zombie: { + keywords: [ "man", "male", "dracula", "undead", "walking dead" ], + "char": '\ud83e\udddf\u200d\u2642\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + woman_genie: { + keywords: [ "woman", "female" ], + "char": '\ud83e\uddde\u200d\u2640\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + man_genie: { + keywords: [ "man", "male" ], + "char": '\ud83e\uddde\u200d\u2642\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + mermaid: { + keywords: [ "woman", "female", "merwoman", "ariel" ], + "char": '\ud83e\udddc\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + merman: { + keywords: [ "man", "male", "triton" ], + "char": '\ud83e\udddc\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_fairy: { + keywords: [ "woman", "female" ], + "char": '\ud83e\uddda\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_fairy: { + keywords: [ "man", "male" ], + "char": '\ud83e\uddda\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + angel: { + keywords: [ "heaven", "wings", "halo" ], + "char": '\ud83d\udc7c', + fitzpatrick_scale: true, + category: "people" + }, + pregnant_woman: { + keywords: [ "baby" ], + "char": '\ud83e\udd30', + fitzpatrick_scale: true, + category: "people" + }, + breastfeeding: { + keywords: [ "nursing", "baby" ], + "char": '\ud83e\udd31', + fitzpatrick_scale: true, + category: "people" + }, + princess: { + keywords: [ "girl", "woman", "female", "blond", "crown", "royal", "queen" ], + "char": '\ud83d\udc78', + fitzpatrick_scale: true, + category: "people" + }, + prince: { + keywords: [ "boy", "man", "male", "crown", "royal", "king" ], + "char": '\ud83e\udd34', + fitzpatrick_scale: true, + category: "people" + }, + bride_with_veil: { + keywords: [ "couple", "marriage", "wedding", "woman", "bride" ], + "char": '\ud83d\udc70', + fitzpatrick_scale: true, + category: "people" + }, + man_in_tuxedo: { + keywords: [ "couple", "marriage", "wedding", "groom" ], + "char": '\ud83e\udd35', + fitzpatrick_scale: true, + category: "people" + }, + running_woman: { + keywords: [ "woman", "walking", "exercise", "race", "running", "female" ], + "char": '\ud83c\udfc3\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + running_man: { + keywords: [ "man", "walking", "exercise", "race", "running" ], + "char": '\ud83c\udfc3', + fitzpatrick_scale: true, + category: "people" + }, + walking_woman: { + keywords: [ "human", "feet", "steps", "woman", "female" ], + "char": '\ud83d\udeb6\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + walking_man: { + keywords: [ "human", "feet", "steps" ], + "char": '\ud83d\udeb6', + fitzpatrick_scale: true, + category: "people" + }, + dancer: { + keywords: [ "female", "girl", "woman", "fun" ], + "char": '\ud83d\udc83', + fitzpatrick_scale: true, + category: "people" + }, + man_dancing: { + keywords: [ "male", "boy", "fun", "dancer" ], + "char": '\ud83d\udd7a', + fitzpatrick_scale: true, + category: "people" + }, + dancing_women: { + keywords: [ "female", "bunny", "women", "girls" ], + "char": '\ud83d\udc6f', + fitzpatrick_scale: false, + category: "people" + }, + dancing_men: { + keywords: [ "male", "bunny", "men", "boys" ], + "char": '\ud83d\udc6f\u200d\u2642\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + couple: { + keywords: [ "pair", "people", "human", "love", "date", "dating", "like", "affection", "valentines", "marriage" ], + "char": '\ud83d\udc6b', + fitzpatrick_scale: false, + category: "people" + }, + two_men_holding_hands: { + keywords: [ "pair", "couple", "love", "like", "bromance", "friendship", "people", "human" ], + "char": '\ud83d\udc6c', + fitzpatrick_scale: false, + category: "people" + }, + two_women_holding_hands: { + keywords: [ "pair", "friendship", "couple", "love", "like", "female", "people", "human" ], + "char": '\ud83d\udc6d', + fitzpatrick_scale: false, + category: "people" + }, + bowing_woman: { + keywords: [ "woman", "female", "girl" ], + "char": '\ud83d\ude47\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + bowing_man: { + keywords: [ "man", "male", "boy" ], + "char": '\ud83d\ude47', + fitzpatrick_scale: true, + category: "people" + }, + man_facepalming: { + keywords: [ "man", "male", "boy", "disbelief" ], + "char": '\ud83e\udd26\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_facepalming: { + keywords: [ "woman", "female", "girl", "disbelief" ], + "char": '\ud83e\udd26\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_shrugging: { + keywords: [ "woman", "female", "girl", "confused", "indifferent", "doubt" ], + "char": '\ud83e\udd37', + fitzpatrick_scale: true, + category: "people" + }, + man_shrugging: { + keywords: [ "man", "male", "boy", "confused", "indifferent", "doubt" ], + "char": '\ud83e\udd37\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + tipping_hand_woman: { + keywords: [ "female", "girl", "woman", "human", "information" ], + "char": '\ud83d\udc81', + fitzpatrick_scale: true, + category: "people" + }, + tipping_hand_man: { + keywords: [ "male", "boy", "man", "human", "information" ], + "char": '\ud83d\udc81\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + no_good_woman: { + keywords: [ "female", "girl", "woman", "nope" ], + "char": '\ud83d\ude45', + fitzpatrick_scale: true, + category: "people" + }, + no_good_man: { + keywords: [ "male", "boy", "man", "nope" ], + "char": '\ud83d\ude45\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + ok_woman: { + keywords: [ "women", "girl", "female", "pink", "human", "woman" ], + "char": '\ud83d\ude46', + fitzpatrick_scale: true, + category: "people" + }, + ok_man: { + keywords: [ "men", "boy", "male", "blue", "human", "man" ], + "char": '\ud83d\ude46\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + raising_hand_woman: { + keywords: [ "female", "girl", "woman" ], + "char": '\ud83d\ude4b', + fitzpatrick_scale: true, + category: "people" + }, + raising_hand_man: { + keywords: [ "male", "boy", "man" ], + "char": '\ud83d\ude4b\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + pouting_woman: { + keywords: [ "female", "girl", "woman" ], + "char": '\ud83d\ude4e', + fitzpatrick_scale: true, + category: "people" + }, + pouting_man: { + keywords: [ "male", "boy", "man" ], + "char": '\ud83d\ude4e\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + frowning_woman: { + keywords: [ "female", "girl", "woman", "sad", "depressed", "discouraged", "unhappy" ], + "char": '\ud83d\ude4d', + fitzpatrick_scale: true, + category: "people" + }, + frowning_man: { + keywords: [ "male", "boy", "man", "sad", "depressed", "discouraged", "unhappy" ], + "char": '\ud83d\ude4d\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + haircut_woman: { + keywords: [ "female", "girl", "woman" ], + "char": '\ud83d\udc87', + fitzpatrick_scale: true, + category: "people" + }, + haircut_man: { + keywords: [ "male", "boy", "man" ], + "char": '\ud83d\udc87\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + massage_woman: { + keywords: [ "female", "girl", "woman", "head" ], + "char": '\ud83d\udc86', + fitzpatrick_scale: true, + category: "people" + }, + massage_man: { + keywords: [ "male", "boy", "man", "head" ], + "char": '\ud83d\udc86\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_in_steamy_room: { + keywords: [ "female", "woman", "spa", "steamroom", "sauna" ], + "char": '\ud83e\uddd6\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_in_steamy_room: { + keywords: [ "male", "man", "spa", "steamroom", "sauna" ], + "char": '\ud83e\uddd6\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + couple_with_heart_woman_man: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + "char": '\ud83d\udc91', + fitzpatrick_scale: false, + category: "people" + }, + couple_with_heart_woman_woman: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + "char": '\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69', + fitzpatrick_scale: false, + category: "people" + }, + couple_with_heart_man_man: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + "char": '\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68', + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_man_woman: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + "char": '\ud83d\udc8f', + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_woman_woman: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + "char": '\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69', + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_man_man: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + "char": '\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68', + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_boy: { + keywords: [ "home", "parents", "child", "mom", "dad", "father", "mother", "people", "human" ], + "char": '\ud83d\udc6a', + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl: { + keywords: [ "home", "parents", "people", "human", "child" ], + "char": '\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_boy: { + keywords: [ "home", "parent", "people", "human", "child" ], + "char": '\ud83d\udc69\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl: { + keywords: [ "home", "parent", "people", "human", "child" ], + "char": '\ud83d\udc69\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": '\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_boy_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": '\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl_girl: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": '\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_man_boy: { + keywords: [ "home", "parent", "people", "human", "child" ], + "char": '\ud83d\udc68\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl: { + keywords: [ "home", "parent", "people", "human", "child" ], + "char": '\ud83d\udc68\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_boy_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl_girl: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": '\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + yarn: { + keywords: [ "ball", "crochet", "knit" ], + "char": '\ud83e\uddf6', + fitzpatrick_scale: false, + category: "people" + }, + thread: { + keywords: [ "needle", "sewing", "spool", "string" ], + "char": '\ud83e\uddf5', + fitzpatrick_scale: false, + category: "people" + }, + coat: { + keywords: [ "jacket" ], + "char": '\ud83e\udde5', + fitzpatrick_scale: false, + category: "people" + }, + labcoat: { + keywords: [ "doctor", "experiment", "scientist", "chemist" ], + "char": '\ud83e\udd7c', + fitzpatrick_scale: false, + category: "people" + }, + womans_clothes: { + keywords: [ "fashion", "shopping_bags", "female" ], + "char": '\ud83d\udc5a', + fitzpatrick_scale: false, + category: "people" + }, + tshirt: { + keywords: [ "fashion", "cloth", "casual", "shirt", "tee" ], + "char": '\ud83d\udc55', + fitzpatrick_scale: false, + category: "people" + }, + jeans: { + keywords: [ "fashion", "shopping" ], + "char": '\ud83d\udc56', + fitzpatrick_scale: false, + category: "people" + }, + necktie: { + keywords: [ "shirt", "suitup", "formal", "fashion", "cloth", "business" ], + "char": '\ud83d\udc54', + fitzpatrick_scale: false, + category: "people" + }, + dress: { + keywords: [ "clothes", "fashion", "shopping" ], + "char": '\ud83d\udc57', + fitzpatrick_scale: false, + category: "people" + }, + bikini: { + keywords: [ "swimming", "female", "woman", "girl", "fashion", "beach", "summer" ], + "char": '\ud83d\udc59', + fitzpatrick_scale: false, + category: "people" + }, + kimono: { + keywords: [ "dress", "fashion", "women", "female", "japanese" ], + "char": '\ud83d\udc58', + fitzpatrick_scale: false, + category: "people" + }, + lipstick: { + keywords: [ "female", "girl", "fashion", "woman" ], + "char": '\ud83d\udc84', + fitzpatrick_scale: false, + category: "people" + }, + kiss: { + keywords: [ "face", "lips", "love", "like", "affection", "valentines" ], + "char": '\ud83d\udc8b', + fitzpatrick_scale: false, + category: "people" + }, + footprints: { + keywords: [ "feet", "tracking", "walking", "beach" ], + "char": '\ud83d\udc63', + fitzpatrick_scale: false, + category: "people" + }, + flat_shoe: { + keywords: [ "ballet", "slip-on", "slipper" ], + "char": '\ud83e\udd7f', + fitzpatrick_scale: false, + category: "people" + }, + high_heel: { + keywords: [ "fashion", "shoes", "female", "pumps", "stiletto" ], + "char": '\ud83d\udc60', + fitzpatrick_scale: false, + category: "people" + }, + sandal: { + keywords: [ "shoes", "fashion", "flip flops" ], + "char": '\ud83d\udc61', + fitzpatrick_scale: false, + category: "people" + }, + boot: { + keywords: [ "shoes", "fashion" ], + "char": '\ud83d\udc62', + fitzpatrick_scale: false, + category: "people" + }, + mans_shoe: { + keywords: [ "fashion", "male" ], + "char": '\ud83d\udc5e', + fitzpatrick_scale: false, + category: "people" + }, + athletic_shoe: { + keywords: [ "shoes", "sports", "sneakers" ], + "char": '\ud83d\udc5f', + fitzpatrick_scale: false, + category: "people" + }, + hiking_boot: { + keywords: [ "backpacking", "camping", "hiking" ], + "char": '\ud83e\udd7e', + fitzpatrick_scale: false, + category: "people" + }, + socks: { + keywords: [ "stockings", "clothes" ], + "char": '\ud83e\udde6', + fitzpatrick_scale: false, + category: "people" + }, + gloves: { + keywords: [ "hands", "winter", "clothes" ], + "char": '\ud83e\udde4', + fitzpatrick_scale: false, + category: "people" + }, + scarf: { + keywords: [ "neck", "winter", "clothes" ], + "char": '\ud83e\udde3', + fitzpatrick_scale: false, + category: "people" + }, + womans_hat: { + keywords: [ "fashion", "accessories", "female", "lady", "spring" ], + "char": '\ud83d\udc52', + fitzpatrick_scale: false, + category: "people" + }, + tophat: { + keywords: [ "magic", "gentleman", "classy", "circus" ], + "char": '\ud83c\udfa9', + fitzpatrick_scale: false, + category: "people" + }, + billed_hat: { + keywords: [ "cap", "baseball" ], + "char": '\ud83e\udde2', + fitzpatrick_scale: false, + category: "people" + }, + rescue_worker_helmet: { + keywords: [ "construction", "build" ], + "char": '\u26d1', + fitzpatrick_scale: false, + category: "people" + }, + mortar_board: { + keywords: [ "school", "college", "degree", "university", "graduation", "cap", "hat", "legal", "learn", "education" ], + "char": '\ud83c\udf93', + fitzpatrick_scale: false, + category: "people" + }, + crown: { + keywords: [ "king", "kod", "leader", "royalty", "lord" ], + "char": '\ud83d\udc51', + fitzpatrick_scale: false, + category: "people" + }, + school_satchel: { + keywords: [ "student", "education", "bag", "backpack" ], + "char": '\ud83c\udf92', + fitzpatrick_scale: false, + category: "people" + }, + luggage: { + keywords: [ "packing", "travel" ], + "char": '\ud83e\uddf3', + fitzpatrick_scale: false, + category: "people" + }, + pouch: { + keywords: [ "bag", "accessories", "shopping" ], + "char": '\ud83d\udc5d', + fitzpatrick_scale: false, + category: "people" + }, + purse: { + keywords: [ "fashion", "accessories", "money", "sales", "shopping" ], + "char": '\ud83d\udc5b', + fitzpatrick_scale: false, + category: "people" + }, + handbag: { + keywords: [ "fashion", "accessory", "accessories", "shopping" ], + "char": '\ud83d\udc5c', + fitzpatrick_scale: false, + category: "people" + }, + briefcase: { + keywords: [ "business", "documents", "work", "law", "legal", "job", "career" ], + "char": '\ud83d\udcbc', + fitzpatrick_scale: false, + category: "people" + }, + eyeglasses: { + keywords: [ "fashion", "accessories", "eyesight", "nerdy", "dork", "geek" ], + "char": '\ud83d\udc53', + fitzpatrick_scale: false, + category: "people" + }, + dark_sunglasses: { + keywords: [ "face", "cool", "accessories" ], + "char": '\ud83d\udd76', + fitzpatrick_scale: false, + category: "people" + }, + goggles: { + keywords: [ "eyes", "protection", "safety" ], + "char": '\ud83e\udd7d', + fitzpatrick_scale: false, + category: "people" + }, + ring: { + keywords: [ "wedding", "propose", "marriage", "valentines", "diamond", "fashion", "jewelry", "gem", "engagement" ], + "char": '\ud83d\udc8d', + fitzpatrick_scale: false, + category: "people" + }, + closed_umbrella: { + keywords: [ "weather", "rain", "drizzle" ], + "char": '\ud83c\udf02', + fitzpatrick_scale: false, + category: "people" + }, + dog: { + keywords: [ "animal", "friend", "nature", "woof", "puppy", "pet", "faithful" ], + "char": '\ud83d\udc36', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cat: { + keywords: [ "animal", "meow", "nature", "pet", "kitten" ], + "char": '\ud83d\udc31', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mouse: { + keywords: [ "animal", "nature", "cheese_wedge", "rodent" ], + "char": '\ud83d\udc2d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hamster: { + keywords: [ "animal", "nature" ], + "char": '\ud83d\udc39', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rabbit: { + keywords: [ "animal", "nature", "pet", "spring", "magic", "bunny" ], + "char": '\ud83d\udc30', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fox_face: { + keywords: [ "animal", "nature", "face" ], + "char": '\ud83e\udd8a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bear: { + keywords: [ "animal", "nature", "wild" ], + "char": '\ud83d\udc3b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + panda_face: { + keywords: [ "animal", "nature", "panda" ], + "char": '\ud83d\udc3c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + koala: { + keywords: [ "animal", "nature" ], + "char": '\ud83d\udc28', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tiger: { + keywords: [ "animal", "cat", "danger", "wild", "nature", "roar" ], + "char": '\ud83d\udc2f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lion: { + keywords: [ "animal", "nature" ], + "char": '\ud83e\udd81', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cow: { + keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ], + "char": '\ud83d\udc2e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig: { + keywords: [ "animal", "oink", "nature" ], + "char": '\ud83d\udc37', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig_nose: { + keywords: [ "animal", "oink" ], + "char": '\ud83d\udc3d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + frog: { + keywords: [ "animal", "nature", "croak", "toad" ], + "char": '\ud83d\udc38', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + squid: { + keywords: [ "animal", "nature", "ocean", "sea" ], + "char": '\ud83e\udd91', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + octopus: { + keywords: [ "animal", "creature", "ocean", "sea", "nature", "beach" ], + "char": '\ud83d\udc19', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shrimp: { + keywords: [ "animal", "ocean", "nature", "seafood" ], + "char": '\ud83e\udd90', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + monkey_face: { + keywords: [ "animal", "nature", "circus" ], + "char": '\ud83d\udc35', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + gorilla: { + keywords: [ "animal", "nature", "circus" ], + "char": '\ud83e\udd8d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + see_no_evil: { + keywords: [ "monkey", "animal", "nature", "haha" ], + "char": '\ud83d\ude48', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hear_no_evil: { + keywords: [ "animal", "monkey", "nature" ], + "char": '\ud83d\ude49', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + speak_no_evil: { + keywords: [ "monkey", "animal", "nature", "omg" ], + "char": '\ud83d\ude4a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + monkey: { + keywords: [ "animal", "nature", "banana", "circus" ], + "char": '\ud83d\udc12', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chicken: { + keywords: [ "animal", "cluck", "nature", "bird" ], + "char": '\ud83d\udc14', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + penguin: { + keywords: [ "animal", "nature" ], + "char": '\ud83d\udc27', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bird: { + keywords: [ "animal", "nature", "fly", "tweet", "spring" ], + "char": '\ud83d\udc26', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + baby_chick: { + keywords: [ "animal", "chicken", "bird" ], + "char": '\ud83d\udc24', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hatching_chick: { + keywords: [ "animal", "chicken", "egg", "born", "baby", "bird" ], + "char": '\ud83d\udc23', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hatched_chick: { + keywords: [ "animal", "chicken", "baby", "bird" ], + "char": '\ud83d\udc25', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + duck: { + keywords: [ "animal", "nature", "bird", "mallard" ], + "char": '\ud83e\udd86', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + eagle: { + keywords: [ "animal", "nature", "bird" ], + "char": '\ud83e\udd85', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + owl: { + keywords: [ "animal", "nature", "bird", "hoot" ], + "char": '\ud83e\udd89', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bat: { + keywords: [ "animal", "nature", "blind", "vampire" ], + "char": '\ud83e\udd87', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wolf: { + keywords: [ "animal", "nature", "wild" ], + "char": '\ud83d\udc3a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + boar: { + keywords: [ "animal", "nature" ], + "char": '\ud83d\udc17', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + horse: { + keywords: [ "animal", "brown", "nature" ], + "char": '\ud83d\udc34', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + unicorn: { + keywords: [ "animal", "nature", "mystical" ], + "char": '\ud83e\udd84', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + honeybee: { + keywords: [ "animal", "insect", "nature", "bug", "spring", "honey" ], + "char": '\ud83d\udc1d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bug: { + keywords: [ "animal", "insect", "nature", "worm" ], + "char": '\ud83d\udc1b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + butterfly: { + keywords: [ "animal", "insect", "nature", "caterpillar" ], + "char": '\ud83e\udd8b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snail: { + keywords: [ "slow", "animal", "shell" ], + "char": '\ud83d\udc0c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + beetle: { + keywords: [ "animal", "insect", "nature", "ladybug" ], + "char": '\ud83d\udc1e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ant: { + keywords: [ "animal", "insect", "nature", "bug" ], + "char": '\ud83d\udc1c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + grasshopper: { + keywords: [ "animal", "cricket", "chirp" ], + "char": '\ud83e\udd97', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + spider: { + keywords: [ "animal", "arachnid" ], + "char": '\ud83d\udd77', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + scorpion: { + keywords: [ "animal", "arachnid" ], + "char": '\ud83e\udd82', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crab: { + keywords: [ "animal", "crustacean" ], + "char": '\ud83e\udd80', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snake: { + keywords: [ "animal", "evil", "nature", "hiss", "python" ], + "char": '\ud83d\udc0d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lizard: { + keywords: [ "animal", "nature", "reptile" ], + "char": '\ud83e\udd8e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + "t-rex": { + keywords: [ "animal", "nature", "dinosaur", "tyrannosaurus", "extinct" ], + "char": '\ud83e\udd96', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sauropod: { + keywords: [ "animal", "nature", "dinosaur", "brachiosaurus", "brontosaurus", "diplodocus", "extinct" ], + "char": '\ud83e\udd95', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + turtle: { + keywords: [ "animal", "slow", "nature", "tortoise" ], + "char": '\ud83d\udc22', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tropical_fish: { + keywords: [ "animal", "swim", "ocean", "beach", "nemo" ], + "char": '\ud83d\udc20', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fish: { + keywords: [ "animal", "food", "nature" ], + "char": '\ud83d\udc1f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + blowfish: { + keywords: [ "animal", "nature", "food", "sea", "ocean" ], + "char": '\ud83d\udc21', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dolphin: { + keywords: [ "animal", "nature", "fish", "sea", "ocean", "flipper", "fins", "beach" ], + "char": '\ud83d\udc2c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shark: { + keywords: [ "animal", "nature", "fish", "sea", "ocean", "jaws", "fins", "beach" ], + "char": '\ud83e\udd88', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + whale: { + keywords: [ "animal", "nature", "sea", "ocean" ], + "char": '\ud83d\udc33', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + whale2: { + keywords: [ "animal", "nature", "sea", "ocean" ], + "char": '\ud83d\udc0b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crocodile: { + keywords: [ "animal", "nature", "reptile", "lizard", "alligator" ], + "char": '\ud83d\udc0a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + leopard: { + keywords: [ "animal", "nature" ], + "char": '\ud83d\udc06', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + zebra: { + keywords: [ "animal", "nature", "stripes", "safari" ], + "char": '\ud83e\udd93', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tiger2: { + keywords: [ "animal", "nature", "roar" ], + "char": '\ud83d\udc05', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + water_buffalo: { + keywords: [ "animal", "nature", "ox", "cow" ], + "char": '\ud83d\udc03', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ox: { + keywords: [ "animal", "cow", "beef" ], + "char": '\ud83d\udc02', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cow2: { + keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ], + "char": '\ud83d\udc04', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + deer: { + keywords: [ "animal", "nature", "horns", "venison" ], + "char": '\ud83e\udd8c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dromedary_camel: { + keywords: [ "animal", "hot", "desert", "hump" ], + "char": '\ud83d\udc2a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + camel: { + keywords: [ "animal", "nature", "hot", "desert", "hump" ], + "char": '\ud83d\udc2b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + giraffe: { + keywords: [ "animal", "nature", "spots", "safari" ], + "char": '\ud83e\udd92', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + elephant: { + keywords: [ "animal", "nature", "nose", "th", "circus" ], + "char": '\ud83d\udc18', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rhinoceros: { + keywords: [ "animal", "nature", "horn" ], + "char": '\ud83e\udd8f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + goat: { + keywords: [ "animal", "nature" ], + "char": '\ud83d\udc10', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ram: { + keywords: [ "animal", "sheep", "nature" ], + "char": '\ud83d\udc0f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sheep: { + keywords: [ "animal", "nature", "wool", "shipit" ], + "char": '\ud83d\udc11', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + racehorse: { + keywords: [ "animal", "gamble", "luck" ], + "char": '\ud83d\udc0e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig2: { + keywords: [ "animal", "nature" ], + "char": '\ud83d\udc16', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rat: { + keywords: [ "animal", "mouse", "rodent" ], + "char": '\ud83d\udc00', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mouse2: { + keywords: [ "animal", "nature", "rodent" ], + "char": '\ud83d\udc01', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rooster: { + keywords: [ "animal", "nature", "chicken" ], + "char": '\ud83d\udc13', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + turkey: { + keywords: [ "animal", "bird" ], + "char": '\ud83e\udd83', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dove: { + keywords: [ "animal", "bird" ], + "char": '\ud83d\udd4a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dog2: { + keywords: [ "animal", "nature", "friend", "doge", "pet", "faithful" ], + "char": '\ud83d\udc15', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + poodle: { + keywords: [ "dog", "animal", "101", "nature", "pet" ], + "char": '\ud83d\udc29', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cat2: { + keywords: [ "animal", "meow", "pet", "cats" ], + "char": '\ud83d\udc08', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rabbit2: { + keywords: [ "animal", "nature", "pet", "magic", "spring" ], + "char": '\ud83d\udc07', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chipmunk: { + keywords: [ "animal", "nature", "rodent", "squirrel" ], + "char": '\ud83d\udc3f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hedgehog: { + keywords: [ "animal", "nature", "spiny" ], + "char": '\ud83e\udd94', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + raccoon: { + keywords: [ "animal", "nature" ], + "char": '\ud83e\udd9d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + llama: { + keywords: [ "animal", "nature", "alpaca" ], + "char": '\ud83e\udd99', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hippopotamus: { + keywords: [ "animal", "nature" ], + "char": '\ud83e\udd9b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + kangaroo: { + keywords: [ "animal", "nature", "australia", "joey", "hop", "marsupial" ], + "char": '\ud83e\udd98', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + badger: { + keywords: [ "animal", "nature", "honey" ], + "char": '\ud83e\udda1', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + swan: { + keywords: [ "animal", "nature", "bird" ], + "char": '\ud83e\udda2', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + peacock: { + keywords: [ "animal", "nature", "peahen", "bird" ], + "char": '\ud83e\udd9a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + parrot: { + keywords: [ "animal", "nature", "bird", "pirate", "talk" ], + "char": '\ud83e\udd9c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lobster: { + keywords: [ "animal", "nature", "bisque", "claws", "seafood" ], + "char": '\ud83e\udd9e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mosquito: { + keywords: [ "animal", "nature", "insect", "malaria" ], + "char": '\ud83e\udd9f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + paw_prints: { + keywords: [ "animal", "tracking", "footprints", "dog", "cat", "pet", "feet" ], + "char": '\ud83d\udc3e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dragon: { + keywords: [ "animal", "myth", "nature", "chinese", "green" ], + "char": '\ud83d\udc09', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dragon_face: { + keywords: [ "animal", "myth", "nature", "chinese", "green" ], + "char": '\ud83d\udc32', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cactus: { + keywords: [ "vegetable", "plant", "nature" ], + "char": '\ud83c\udf35', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + christmas_tree: { + keywords: [ "festival", "vacation", "december", "xmas", "celebration" ], + "char": '\ud83c\udf84', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + evergreen_tree: { + keywords: [ "plant", "nature" ], + "char": '\ud83c\udf32', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + deciduous_tree: { + keywords: [ "plant", "nature" ], + "char": '\ud83c\udf33', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + palm_tree: { + keywords: [ "plant", "vegetable", "nature", "summer", "beach", "mojito", "tropical" ], + "char": '\ud83c\udf34', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + seedling: { + keywords: [ "plant", "nature", "grass", "lawn", "spring" ], + "char": '\ud83c\udf31', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + herb: { + keywords: [ "vegetable", "plant", "medicine", "weed", "grass", "lawn" ], + "char": '\ud83c\udf3f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shamrock: { + keywords: [ "vegetable", "plant", "nature", "irish", "clover" ], + "char": '\u2618', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + four_leaf_clover: { + keywords: [ "vegetable", "plant", "nature", "lucky", "irish" ], + "char": '\ud83c\udf40', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bamboo: { + keywords: [ "plant", "nature", "vegetable", "panda", "pine_decoration" ], + "char": '\ud83c\udf8d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tanabata_tree: { + keywords: [ "plant", "nature", "branch", "summer" ], + "char": '\ud83c\udf8b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + leaves: { + keywords: [ "nature", "plant", "tree", "vegetable", "grass", "lawn", "spring" ], + "char": '\ud83c\udf43', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fallen_leaf: { + keywords: [ "nature", "plant", "vegetable", "leaves" ], + "char": '\ud83c\udf42', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + maple_leaf: { + keywords: [ "nature", "plant", "vegetable", "ca", "fall" ], + "char": '\ud83c\udf41', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ear_of_rice: { + keywords: [ "nature", "plant" ], + "char": '\ud83c\udf3e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hibiscus: { + keywords: [ "plant", "vegetable", "flowers", "beach" ], + "char": '\ud83c\udf3a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sunflower: { + keywords: [ "nature", "plant", "fall" ], + "char": '\ud83c\udf3b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rose: { + keywords: [ "flowers", "valentines", "love", "spring" ], + "char": '\ud83c\udf39', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wilted_flower: { + keywords: [ "plant", "nature", "flower" ], + "char": '\ud83e\udd40', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tulip: { + keywords: [ "flowers", "plant", "nature", "summer", "spring" ], + "char": '\ud83c\udf37', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + blossom: { + keywords: [ "nature", "flowers", "yellow" ], + "char": '\ud83c\udf3c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cherry_blossom: { + keywords: [ "nature", "plant", "spring", "flower" ], + "char": '\ud83c\udf38', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bouquet: { + keywords: [ "flowers", "nature", "spring" ], + "char": '\ud83d\udc90', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mushroom: { + keywords: [ "plant", "vegetable" ], + "char": '\ud83c\udf44', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chestnut: { + keywords: [ "food", "squirrel" ], + "char": '\ud83c\udf30', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + jack_o_lantern: { + keywords: [ "halloween", "light", "pumpkin", "creepy", "fall" ], + "char": '\ud83c\udf83', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shell: { + keywords: [ "nature", "sea", "beach" ], + "char": '\ud83d\udc1a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + spider_web: { + keywords: [ "animal", "insect", "arachnid", "silk" ], + "char": '\ud83d\udd78', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_americas: { + keywords: [ "globe", "world", "USA", "international" ], + "char": '\ud83c\udf0e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_africa: { + keywords: [ "globe", "world", "international" ], + "char": '\ud83c\udf0d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_asia: { + keywords: [ "globe", "world", "east", "international" ], + "char": '\ud83c\udf0f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + full_moon: { + keywords: [ "nature", "yellow", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": '\ud83c\udf15', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waning_gibbous_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep", "waxing_gibbous_moon" ], + "char": '\ud83c\udf16', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + last_quarter_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": '\ud83c\udf17', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waning_crescent_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": '\ud83c\udf18', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + new_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": '\ud83c\udf11', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waxing_crescent_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": '\ud83c\udf12', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + first_quarter_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": '\ud83c\udf13', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waxing_gibbous_moon: { + keywords: [ "nature", "night", "sky", "gray", "twilight", "planet", "space", "evening", "sleep" ], + "char": '\ud83c\udf14', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + new_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": '\ud83c\udf1a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + full_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": '\ud83c\udf1d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + first_quarter_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": '\ud83c\udf1b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + last_quarter_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": '\ud83c\udf1c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_with_face: { + keywords: [ "nature", "morning", "sky" ], + "char": '\ud83c\udf1e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crescent_moon: { + keywords: [ "night", "sleep", "sky", "evening", "magic" ], + "char": '\ud83c\udf19', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + star: { + keywords: [ "night", "yellow" ], + "char": '\u2b50', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + star2: { + keywords: [ "night", "sparkle", "awesome", "good", "magic" ], + "char": '\ud83c\udf1f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dizzy: { + keywords: [ "star", "sparkle", "shoot", "magic" ], + "char": '\ud83d\udcab', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sparkles: { + keywords: [ "stars", "shine", "shiny", "cool", "awesome", "good", "magic" ], + "char": '\u2728', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + comet: { + keywords: [ "space" ], + "char": '\u2604', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sunny: { + keywords: [ "weather", "nature", "brightness", "summer", "beach", "spring" ], + "char": '\u2600\ufe0f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_small_cloud: { + keywords: [ "weather" ], + "char": '\ud83c\udf24', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + partly_sunny: { + keywords: [ "weather", "nature", "cloudy", "morning", "fall", "spring" ], + "char": '\u26c5', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_large_cloud: { + keywords: [ "weather" ], + "char": '\ud83c\udf25', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_rain_cloud: { + keywords: [ "weather" ], + "char": '\ud83c\udf26', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud: { + keywords: [ "weather", "sky" ], + "char": '\u2601\ufe0f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_rain: { + keywords: [ "weather" ], + "char": '\ud83c\udf27', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_lightning_and_rain: { + keywords: [ "weather", "lightning" ], + "char": '\u26c8', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_lightning: { + keywords: [ "weather", "thunder" ], + "char": '\ud83c\udf29', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + zap: { + keywords: [ "thunder", "weather", "lightning bolt", "fast" ], + "char": '\u26a1', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fire: { + keywords: [ "hot", "cook", "flame" ], + "char": '\ud83d\udd25', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + boom: { + keywords: [ "bomb", "explode", "explosion", "collision", "blown" ], + "char": '\ud83d\udca5', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowflake: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas" ], + "char": '\u2744\ufe0f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_snow: { + keywords: [ "weather" ], + "char": '\ud83c\udf28', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowman: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen", "without_snow" ], + "char": '\u26c4', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowman_with_snow: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen" ], + "char": '\u2603', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wind_face: { + keywords: [ "gust", "air" ], + "char": '\ud83c\udf2c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dash: { + keywords: [ "wind", "air", "fast", "shoo", "fart", "smoke", "puff" ], + "char": '\ud83d\udca8', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tornado: { + keywords: [ "weather", "cyclone", "twister" ], + "char": '\ud83c\udf2a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fog: { + keywords: [ "weather" ], + "char": '\ud83c\udf2b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + open_umbrella: { + keywords: [ "weather", "spring" ], + "char": '\u2602', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + umbrella: { + keywords: [ "rainy", "weather", "spring" ], + "char": '\u2614', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + droplet: { + keywords: [ "water", "drip", "faucet", "spring" ], + "char": '\ud83d\udca7', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sweat_drops: { + keywords: [ "water", "drip", "oops" ], + "char": '\ud83d\udca6', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ocean: { + keywords: [ "sea", "water", "wave", "nature", "tsunami", "disaster" ], + "char": '\ud83c\udf0a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + green_apple: { + keywords: [ "fruit", "nature" ], + "char": '\ud83c\udf4f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + apple: { + keywords: [ "fruit", "mac", "school" ], + "char": '\ud83c\udf4e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pear: { + keywords: [ "fruit", "nature", "food" ], + "char": '\ud83c\udf50', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tangerine: { + keywords: [ "food", "fruit", "nature", "orange" ], + "char": '\ud83c\udf4a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + lemon: { + keywords: [ "fruit", "nature" ], + "char": '\ud83c\udf4b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + banana: { + keywords: [ "fruit", "food", "monkey" ], + "char": '\ud83c\udf4c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + watermelon: { + keywords: [ "fruit", "food", "picnic", "summer" ], + "char": '\ud83c\udf49', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + grapes: { + keywords: [ "fruit", "food", "wine" ], + "char": '\ud83c\udf47', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + strawberry: { + keywords: [ "fruit", "food", "nature" ], + "char": '\ud83c\udf53', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + melon: { + keywords: [ "fruit", "nature", "food" ], + "char": '\ud83c\udf48', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cherries: { + keywords: [ "food", "fruit" ], + "char": '\ud83c\udf52', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + peach: { + keywords: [ "fruit", "nature", "food" ], + "char": '\ud83c\udf51', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pineapple: { + keywords: [ "fruit", "nature", "food" ], + "char": '\ud83c\udf4d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + coconut: { + keywords: [ "fruit", "nature", "food", "palm" ], + "char": '\ud83e\udd65', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + kiwi_fruit: { + keywords: [ "fruit", "food" ], + "char": '\ud83e\udd5d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + mango: { + keywords: [ "fruit", "food", "tropical" ], + "char": '\ud83e\udd6d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + avocado: { + keywords: [ "fruit", "food" ], + "char": '\ud83e\udd51', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + broccoli: { + keywords: [ "fruit", "food", "vegetable" ], + "char": '\ud83e\udd66', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tomato: { + keywords: [ "fruit", "vegetable", "nature", "food" ], + "char": '\ud83c\udf45', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + eggplant: { + keywords: [ "vegetable", "nature", "food", "aubergine" ], + "char": '\ud83c\udf46', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cucumber: { + keywords: [ "fruit", "food", "pickle" ], + "char": '\ud83e\udd52', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + carrot: { + keywords: [ "vegetable", "food", "orange" ], + "char": '\ud83e\udd55', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hot_pepper: { + keywords: [ "food", "spicy", "chilli", "chili" ], + "char": '\ud83c\udf36', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + potato: { + keywords: [ "food", "tuber", "vegatable", "starch" ], + "char": '\ud83e\udd54', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + corn: { + keywords: [ "food", "vegetable", "plant" ], + "char": '\ud83c\udf3d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + leafy_greens: { + keywords: [ "food", "vegetable", "plant", "bok choy", "cabbage", "kale", "lettuce" ], + "char": '\ud83e\udd6c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sweet_potato: { + keywords: [ "food", "nature" ], + "char": '\ud83c\udf60', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + peanuts: { + keywords: [ "food", "nut" ], + "char": '\ud83e\udd5c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + honey_pot: { + keywords: [ "bees", "sweet", "kitchen" ], + "char": '\ud83c\udf6f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + croissant: { + keywords: [ "food", "bread", "french" ], + "char": '\ud83e\udd50', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bread: { + keywords: [ "food", "wheat", "breakfast", "toast" ], + "char": '\ud83c\udf5e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + baguette_bread: { + keywords: [ "food", "bread", "french" ], + "char": '\ud83e\udd56', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bagel: { + keywords: [ "food", "bread", "bakery", "schmear" ], + "char": '\ud83e\udd6f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pretzel: { + keywords: [ "food", "bread", "twisted" ], + "char": '\ud83e\udd68', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cheese: { + keywords: [ "food", "chadder" ], + "char": '\ud83e\uddc0', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + egg: { + keywords: [ "food", "chicken", "breakfast" ], + "char": '\ud83e\udd5a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bacon: { + keywords: [ "food", "breakfast", "pork", "pig", "meat" ], + "char": '\ud83e\udd53', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + steak: { + keywords: [ "food", "cow", "meat", "cut", "chop", "lambchop", "porkchop" ], + "char": '\ud83e\udd69', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pancakes: { + keywords: [ "food", "breakfast", "flapjacks", "hotcakes" ], + "char": '\ud83e\udd5e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + poultry_leg: { + keywords: [ "food", "meat", "drumstick", "bird", "chicken", "turkey" ], + "char": '\ud83c\udf57', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + meat_on_bone: { + keywords: [ "good", "food", "drumstick" ], + "char": '\ud83c\udf56', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bone: { + keywords: [ "skeleton" ], + "char": '\ud83e\uddb4', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fried_shrimp: { + keywords: [ "food", "animal", "appetizer", "summer" ], + "char": '\ud83c\udf64', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fried_egg: { + keywords: [ "food", "breakfast", "kitchen", "egg" ], + "char": '\ud83c\udf73', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hamburger: { + keywords: [ "meat", "fast food", "beef", "cheeseburger", "mcdonalds", "burger king" ], + "char": '\ud83c\udf54', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fries: { + keywords: [ "chips", "snack", "fast food" ], + "char": '\ud83c\udf5f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + stuffed_flatbread: { + keywords: [ "food", "flatbread", "stuffed", "gyro" ], + "char": '\ud83e\udd59', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hotdog: { + keywords: [ "food", "frankfurter" ], + "char": '\ud83c\udf2d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pizza: { + keywords: [ "food", "party" ], + "char": '\ud83c\udf55', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sandwich: { + keywords: [ "food", "lunch", "bread" ], + "char": '\ud83e\udd6a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + canned_food: { + keywords: [ "food", "soup" ], + "char": '\ud83e\udd6b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + spaghetti: { + keywords: [ "food", "italian", "noodle" ], + "char": '\ud83c\udf5d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + taco: { + keywords: [ "food", "mexican" ], + "char": '\ud83c\udf2e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + burrito: { + keywords: [ "food", "mexican" ], + "char": '\ud83c\udf2f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + green_salad: { + keywords: [ "food", "healthy", "lettuce" ], + "char": '\ud83e\udd57', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + shallow_pan_of_food: { + keywords: [ "food", "cooking", "casserole", "paella" ], + "char": '\ud83e\udd58', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + ramen: { + keywords: [ "food", "japanese", "noodle", "chopsticks" ], + "char": '\ud83c\udf5c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + stew: { + keywords: [ "food", "meat", "soup" ], + "char": '\ud83c\udf72', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fish_cake: { + keywords: [ "food", "japan", "sea", "beach", "narutomaki", "pink", "swirl", "kamaboko", "surimi", "ramen" ], + "char": '\ud83c\udf65', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fortune_cookie: { + keywords: [ "food", "prophecy" ], + "char": '\ud83e\udd60', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sushi: { + keywords: [ "food", "fish", "japanese", "rice" ], + "char": '\ud83c\udf63', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bento: { + keywords: [ "food", "japanese", "box" ], + "char": '\ud83c\udf71', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + curry: { + keywords: [ "food", "spicy", "hot", "indian" ], + "char": '\ud83c\udf5b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice_ball: { + keywords: [ "food", "japanese" ], + "char": '\ud83c\udf59', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice: { + keywords: [ "food", "china", "asian" ], + "char": '\ud83c\udf5a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice_cracker: { + keywords: [ "food", "japanese" ], + "char": '\ud83c\udf58', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + oden: { + keywords: [ "food", "japanese" ], + "char": '\ud83c\udf62', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + dango: { + keywords: [ "food", "dessert", "sweet", "japanese", "barbecue", "meat" ], + "char": '\ud83c\udf61', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + shaved_ice: { + keywords: [ "hot", "dessert", "summer" ], + "char": '\ud83c\udf67', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + ice_cream: { + keywords: [ "food", "hot", "dessert" ], + "char": '\ud83c\udf68', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + icecream: { + keywords: [ "food", "hot", "dessert", "summer" ], + "char": '\ud83c\udf66', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pie: { + keywords: [ "food", "dessert", "pastry" ], + "char": '\ud83e\udd67', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cake: { + keywords: [ "food", "dessert" ], + "char": '\ud83c\udf70', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cupcake: { + keywords: [ "food", "dessert", "bakery", "sweet" ], + "char": '\ud83e\uddc1', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + moon_cake: { + keywords: [ "food", "autumn" ], + "char": '\ud83e\udd6e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + birthday: { + keywords: [ "food", "dessert", "cake" ], + "char": '\ud83c\udf82', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + custard: { + keywords: [ "dessert", "food" ], + "char": '\ud83c\udf6e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + candy: { + keywords: [ "snack", "dessert", "sweet", "lolly" ], + "char": '\ud83c\udf6c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + lollipop: { + keywords: [ "food", "snack", "candy", "sweet" ], + "char": '\ud83c\udf6d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + chocolate_bar: { + keywords: [ "food", "snack", "dessert", "sweet" ], + "char": '\ud83c\udf6b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + popcorn: { + keywords: [ "food", "movie theater", "films", "snack" ], + "char": '\ud83c\udf7f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + dumpling: { + keywords: [ "food", "empanada", "pierogi", "potsticker" ], + "char": '\ud83e\udd5f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + doughnut: { + keywords: [ "food", "dessert", "snack", "sweet", "donut" ], + "char": '\ud83c\udf69', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cookie: { + keywords: [ "food", "snack", "oreo", "chocolate", "sweet", "dessert" ], + "char": '\ud83c\udf6a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + milk_glass: { + keywords: [ "beverage", "drink", "cow" ], + "char": '\ud83e\udd5b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + beer: { + keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ], + "char": '\ud83c\udf7a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + beers: { + keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ], + "char": '\ud83c\udf7b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + clinking_glasses: { + keywords: [ "beverage", "drink", "party", "alcohol", "celebrate", "cheers", "wine", "champagne", "toast" ], + "char": '\ud83e\udd42', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + wine_glass: { + keywords: [ "drink", "beverage", "drunk", "alcohol", "booze" ], + "char": '\ud83c\udf77', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tumbler_glass: { + keywords: [ "drink", "beverage", "drunk", "alcohol", "liquor", "booze", "bourbon", "scotch", "whisky", "glass", "shot" ], + "char": '\ud83e\udd43', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cocktail: { + keywords: [ "drink", "drunk", "alcohol", "beverage", "booze", "mojito" ], + "char": '\ud83c\udf78', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tropical_drink: { + keywords: [ "beverage", "cocktail", "summer", "beach", "alcohol", "booze", "mojito" ], + "char": '\ud83c\udf79', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + champagne: { + keywords: [ "drink", "wine", "bottle", "celebration" ], + "char": '\ud83c\udf7e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sake: { + keywords: [ "wine", "drink", "drunk", "beverage", "japanese", "alcohol", "booze" ], + "char": '\ud83c\udf76', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tea: { + keywords: [ "drink", "bowl", "breakfast", "green", "british" ], + "char": '\ud83c\udf75', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cup_with_straw: { + keywords: [ "drink", "soda" ], + "char": '\ud83e\udd64', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + coffee: { + keywords: [ "beverage", "caffeine", "latte", "espresso" ], + "char": '\u2615', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + baby_bottle: { + keywords: [ "food", "container", "milk" ], + "char": '\ud83c\udf7c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + salt: { + keywords: [ "condiment", "shaker" ], + "char": '\ud83e\uddc2', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + spoon: { + keywords: [ "cutlery", "kitchen", "tableware" ], + "char": '\ud83e\udd44', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fork_and_knife: { + keywords: [ "cutlery", "kitchen" ], + "char": '\ud83c\udf74', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + plate_with_cutlery: { + keywords: [ "food", "eat", "meal", "lunch", "dinner", "restaurant" ], + "char": '\ud83c\udf7d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bowl_with_spoon: { + keywords: [ "food", "breakfast", "cereal", "oatmeal", "porridge" ], + "char": '\ud83e\udd63', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + takeout_box: { + keywords: [ "food", "leftovers" ], + "char": '\ud83e\udd61', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + chopsticks: { + keywords: [ "food" ], + "char": '\ud83e\udd62', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + soccer: { + keywords: [ "sports", "football" ], + "char": '\u26bd', + fitzpatrick_scale: false, + category: "activity" + }, + basketball: { + keywords: [ "sports", "balls", "NBA" ], + "char": '\ud83c\udfc0', + fitzpatrick_scale: false, + category: "activity" + }, + football: { + keywords: [ "sports", "balls", "NFL" ], + "char": '\ud83c\udfc8', + fitzpatrick_scale: false, + category: "activity" + }, + baseball: { + keywords: [ "sports", "balls" ], + "char": '\u26be', + fitzpatrick_scale: false, + category: "activity" + }, + softball: { + keywords: [ "sports", "balls" ], + "char": '\ud83e\udd4e', + fitzpatrick_scale: false, + category: "activity" + }, + tennis: { + keywords: [ "sports", "balls", "green" ], + "char": '\ud83c\udfbe', + fitzpatrick_scale: false, + category: "activity" + }, + volleyball: { + keywords: [ "sports", "balls" ], + "char": '\ud83c\udfd0', + fitzpatrick_scale: false, + category: "activity" + }, + rugby_football: { + keywords: [ "sports", "team" ], + "char": '\ud83c\udfc9', + fitzpatrick_scale: false, + category: "activity" + }, + flying_disc: { + keywords: [ "sports", "frisbee", "ultimate" ], + "char": '\ud83e\udd4f', + fitzpatrick_scale: false, + category: "activity" + }, + "8ball": { + keywords: [ "pool", "hobby", "game", "luck", "magic" ], + "char": '\ud83c\udfb1', + fitzpatrick_scale: false, + category: "activity" + }, + golf: { + keywords: [ "sports", "business", "flag", "hole", "summer" ], + "char": '\u26f3', + fitzpatrick_scale: false, + category: "activity" + }, + golfing_woman: { + keywords: [ "sports", "business", "woman", "female" ], + "char": '\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f', + fitzpatrick_scale: false, + category: "activity" + }, + golfing_man: { + keywords: [ "sports", "business" ], + "char": '\ud83c\udfcc', + fitzpatrick_scale: true, + category: "activity" + }, + ping_pong: { + keywords: [ "sports", "pingpong" ], + "char": '\ud83c\udfd3', + fitzpatrick_scale: false, + category: "activity" + }, + badminton: { + keywords: [ "sports" ], + "char": '\ud83c\udff8', + fitzpatrick_scale: false, + category: "activity" + }, + goal_net: { + keywords: [ "sports" ], + "char": '\ud83e\udd45', + fitzpatrick_scale: false, + category: "activity" + }, + ice_hockey: { + keywords: [ "sports" ], + "char": '\ud83c\udfd2', + fitzpatrick_scale: false, + category: "activity" + }, + field_hockey: { + keywords: [ "sports" ], + "char": '\ud83c\udfd1', + fitzpatrick_scale: false, + category: "activity" + }, + lacrosse: { + keywords: [ "sports", "ball", "stick" ], + "char": '\ud83e\udd4d', + fitzpatrick_scale: false, + category: "activity" + }, + cricket: { + keywords: [ "sports" ], + "char": '\ud83c\udfcf', + fitzpatrick_scale: false, + category: "activity" + }, + ski: { + keywords: [ "sports", "winter", "cold", "snow" ], + "char": '\ud83c\udfbf', + fitzpatrick_scale: false, + category: "activity" + }, + skier: { + keywords: [ "sports", "winter", "snow" ], + "char": '\u26f7', + fitzpatrick_scale: false, + category: "activity" + }, + snowboarder: { + keywords: [ "sports", "winter" ], + "char": '\ud83c\udfc2', + fitzpatrick_scale: true, + category: "activity" + }, + person_fencing: { + keywords: [ "sports", "fencing", "sword" ], + "char": '\ud83e\udd3a', + fitzpatrick_scale: false, + category: "activity" + }, + women_wrestling: { + keywords: [ "sports", "wrestlers" ], + "char": '\ud83e\udd3c\u200d\u2640\ufe0f', + fitzpatrick_scale: false, + category: "activity" + }, + men_wrestling: { + keywords: [ "sports", "wrestlers" ], + "char": '\ud83e\udd3c\u200d\u2642\ufe0f', + fitzpatrick_scale: false, + category: "activity" + }, + woman_cartwheeling: { + keywords: [ "gymnastics" ], + "char": '\ud83e\udd38\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + man_cartwheeling: { + keywords: [ "gymnastics" ], + "char": '\ud83e\udd38\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + woman_playing_handball: { + keywords: [ "sports" ], + "char": '\ud83e\udd3e\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + man_playing_handball: { + keywords: [ "sports" ], + "char": '\ud83e\udd3e\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + ice_skate: { + keywords: [ "sports" ], + "char": '\u26f8', + fitzpatrick_scale: false, + category: "activity" + }, + curling_stone: { + keywords: [ "sports" ], + "char": '\ud83e\udd4c', + fitzpatrick_scale: false, + category: "activity" + }, + skateboard: { + keywords: [ "board" ], + "char": '\ud83d\udef9', + fitzpatrick_scale: false, + category: "activity" + }, + sled: { + keywords: [ "sleigh", "luge", "toboggan" ], + "char": '\ud83d\udef7', + fitzpatrick_scale: false, + category: "activity" + }, + bow_and_arrow: { + keywords: [ "sports" ], + "char": '\ud83c\udff9', + fitzpatrick_scale: false, + category: "activity" + }, + fishing_pole_and_fish: { + keywords: [ "food", "hobby", "summer" ], + "char": '\ud83c\udfa3', + fitzpatrick_scale: false, + category: "activity" + }, + boxing_glove: { + keywords: [ "sports", "fighting" ], + "char": '\ud83e\udd4a', + fitzpatrick_scale: false, + category: "activity" + }, + martial_arts_uniform: { + keywords: [ "judo", "karate", "taekwondo" ], + "char": '\ud83e\udd4b', + fitzpatrick_scale: false, + category: "activity" + }, + rowing_woman: { + keywords: [ "sports", "hobby", "water", "ship", "woman", "female" ], + "char": '\ud83d\udea3\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + rowing_man: { + keywords: [ "sports", "hobby", "water", "ship" ], + "char": '\ud83d\udea3', + fitzpatrick_scale: true, + category: "activity" + }, + climbing_woman: { + keywords: [ "sports", "hobby", "woman", "female", "rock" ], + "char": '\ud83e\uddd7\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + climbing_man: { + keywords: [ "sports", "hobby", "man", "male", "rock" ], + "char": '\ud83e\uddd7\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + swimming_woman: { + keywords: [ "sports", "exercise", "human", "athlete", "water", "summer", "woman", "female" ], + "char": '\ud83c\udfca\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + swimming_man: { + keywords: [ "sports", "exercise", "human", "athlete", "water", "summer" ], + "char": '\ud83c\udfca', + fitzpatrick_scale: true, + category: "activity" + }, + woman_playing_water_polo: { + keywords: [ "sports", "pool" ], + "char": '\ud83e\udd3d\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + man_playing_water_polo: { + keywords: [ "sports", "pool" ], + "char": '\ud83e\udd3d\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + woman_in_lotus_position: { + keywords: [ "woman", "female", "meditation", "yoga", "serenity", "zen", "mindfulness" ], + "char": '\ud83e\uddd8\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + man_in_lotus_position: { + keywords: [ "man", "male", "meditation", "yoga", "serenity", "zen", "mindfulness" ], + "char": '\ud83e\uddd8\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + surfing_woman: { + keywords: [ "sports", "ocean", "sea", "summer", "beach", "woman", "female" ], + "char": '\ud83c\udfc4\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + surfing_man: { + keywords: [ "sports", "ocean", "sea", "summer", "beach" ], + "char": '\ud83c\udfc4', + fitzpatrick_scale: true, + category: "activity" + }, + bath: { + keywords: [ "clean", "shower", "bathroom" ], + "char": '\ud83d\udec0', + fitzpatrick_scale: true, + category: "activity" + }, + basketball_woman: { + keywords: [ "sports", "human", "woman", "female" ], + "char": '\u26f9\ufe0f\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + basketball_man: { + keywords: [ "sports", "human" ], + "char": '\u26f9', + fitzpatrick_scale: true, + category: "activity" + }, + weight_lifting_woman: { + keywords: [ "sports", "training", "exercise", "woman", "female" ], + "char": '\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + weight_lifting_man: { + keywords: [ "sports", "training", "exercise" ], + "char": '\ud83c\udfcb', + fitzpatrick_scale: true, + category: "activity" + }, + biking_woman: { + keywords: [ "sports", "bike", "exercise", "hipster", "woman", "female" ], + "char": '\ud83d\udeb4\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + biking_man: { + keywords: [ "sports", "bike", "exercise", "hipster" ], + "char": '\ud83d\udeb4', + fitzpatrick_scale: true, + category: "activity" + }, + mountain_biking_woman: { + keywords: [ "transportation", "sports", "human", "race", "bike", "woman", "female" ], + "char": '\ud83d\udeb5\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + mountain_biking_man: { + keywords: [ "transportation", "sports", "human", "race", "bike" ], + "char": '\ud83d\udeb5', + fitzpatrick_scale: true, + category: "activity" + }, + horse_racing: { + keywords: [ "animal", "betting", "competition", "gambling", "luck" ], + "char": '\ud83c\udfc7', + fitzpatrick_scale: true, + category: "activity" + }, + business_suit_levitating: { + keywords: [ "suit", "business", "levitate", "hover", "jump" ], + "char": '\ud83d\udd74', + fitzpatrick_scale: true, + category: "activity" + }, + trophy: { + keywords: [ "win", "award", "contest", "place", "ftw", "ceremony" ], + "char": '\ud83c\udfc6', + fitzpatrick_scale: false, + category: "activity" + }, + running_shirt_with_sash: { + keywords: [ "play", "pageant" ], + "char": '\ud83c\udfbd', + fitzpatrick_scale: false, + category: "activity" + }, + medal_sports: { + keywords: [ "award", "winning" ], + "char": '\ud83c\udfc5', + fitzpatrick_scale: false, + category: "activity" + }, + medal_military: { + keywords: [ "award", "winning", "army" ], + "char": '\ud83c\udf96', + fitzpatrick_scale: false, + category: "activity" + }, + "1st_place_medal": { + keywords: [ "award", "winning", "first" ], + "char": '\ud83e\udd47', + fitzpatrick_scale: false, + category: "activity" + }, + "2nd_place_medal": { + keywords: [ "award", "second" ], + "char": '\ud83e\udd48', + fitzpatrick_scale: false, + category: "activity" + }, + "3rd_place_medal": { + keywords: [ "award", "third" ], + "char": '\ud83e\udd49', + fitzpatrick_scale: false, + category: "activity" + }, + reminder_ribbon: { + keywords: [ "sports", "cause", "support", "awareness" ], + "char": '\ud83c\udf97', + fitzpatrick_scale: false, + category: "activity" + }, + rosette: { + keywords: [ "flower", "decoration", "military" ], + "char": '\ud83c\udff5', + fitzpatrick_scale: false, + category: "activity" + }, + ticket: { + keywords: [ "event", "concert", "pass" ], + "char": '\ud83c\udfab', + fitzpatrick_scale: false, + category: "activity" + }, + tickets: { + keywords: [ "sports", "concert", "entrance" ], + "char": '\ud83c\udf9f', + fitzpatrick_scale: false, + category: "activity" + }, + performing_arts: { + keywords: [ "acting", "theater", "drama" ], + "char": '\ud83c\udfad', + fitzpatrick_scale: false, + category: "activity" + }, + art: { + keywords: [ "design", "paint", "draw", "colors" ], + "char": '\ud83c\udfa8', + fitzpatrick_scale: false, + category: "activity" + }, + circus_tent: { + keywords: [ "festival", "carnival", "party" ], + "char": '\ud83c\udfaa', + fitzpatrick_scale: false, + category: "activity" + }, + woman_juggling: { + keywords: [ "juggle", "balance", "skill", "multitask" ], + "char": '\ud83e\udd39\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + man_juggling: { + keywords: [ "juggle", "balance", "skill", "multitask" ], + "char": '\ud83e\udd39\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + microphone: { + keywords: [ "sound", "music", "PA", "sing", "talkshow" ], + "char": '\ud83c\udfa4', + fitzpatrick_scale: false, + category: "activity" + }, + headphones: { + keywords: [ "music", "score", "gadgets" ], + "char": '\ud83c\udfa7', + fitzpatrick_scale: false, + category: "activity" + }, + musical_score: { + keywords: [ "treble", "clef", "compose" ], + "char": '\ud83c\udfbc', + fitzpatrick_scale: false, + category: "activity" + }, + musical_keyboard: { + keywords: [ "piano", "instrument", "compose" ], + "char": '\ud83c\udfb9', + fitzpatrick_scale: false, + category: "activity" + }, + drum: { + keywords: [ "music", "instrument", "drumsticks", "snare" ], + "char": '\ud83e\udd41', + fitzpatrick_scale: false, + category: "activity" + }, + saxophone: { + keywords: [ "music", "instrument", "jazz", "blues" ], + "char": '\ud83c\udfb7', + fitzpatrick_scale: false, + category: "activity" + }, + trumpet: { + keywords: [ "music", "brass" ], + "char": '\ud83c\udfba', + fitzpatrick_scale: false, + category: "activity" + }, + guitar: { + keywords: [ "music", "instrument" ], + "char": '\ud83c\udfb8', + fitzpatrick_scale: false, + category: "activity" + }, + violin: { + keywords: [ "music", "instrument", "orchestra", "symphony" ], + "char": '\ud83c\udfbb', + fitzpatrick_scale: false, + category: "activity" + }, + clapper: { + keywords: [ "movie", "film", "record" ], + "char": '\ud83c\udfac', + fitzpatrick_scale: false, + category: "activity" + }, + video_game: { + keywords: [ "play", "console", "PS4", "controller" ], + "char": '\ud83c\udfae', + fitzpatrick_scale: false, + category: "activity" + }, + space_invader: { + keywords: [ "game", "arcade", "play" ], + "char": '\ud83d\udc7e', + fitzpatrick_scale: false, + category: "activity" + }, + dart: { + keywords: [ "game", "play", "bar", "target", "bullseye" ], + "char": '\ud83c\udfaf', + fitzpatrick_scale: false, + category: "activity" + }, + game_die: { + keywords: [ "dice", "random", "tabletop", "play", "luck" ], + "char": '\ud83c\udfb2', + fitzpatrick_scale: false, + category: "activity" + }, + chess_pawn: { + keywords: [ "expendable" ], + "char": "\u265f", + fitzpatrick_scale: false, + category: "activity" + }, + slot_machine: { + keywords: [ "bet", "gamble", "vegas", "fruit machine", "luck", "casino" ], + "char": '\ud83c\udfb0', + fitzpatrick_scale: false, + category: "activity" + }, + jigsaw: { + keywords: [ "interlocking", "puzzle", "piece" ], + "char": '\ud83e\udde9', + fitzpatrick_scale: false, + category: "activity" + }, + bowling: { + keywords: [ "sports", "fun", "play" ], + "char": '\ud83c\udfb3', + fitzpatrick_scale: false, + category: "activity" + }, + red_car: { + keywords: [ "red", "transportation", "vehicle" ], + "char": '\ud83d\ude97', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + taxi: { + keywords: [ "uber", "vehicle", "cars", "transportation" ], + "char": '\ud83d\ude95', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + blue_car: { + keywords: [ "transportation", "vehicle" ], + "char": '\ud83d\ude99', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bus: { + keywords: [ "car", "vehicle", "transportation" ], + "char": '\ud83d\ude8c', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + trolleybus: { + keywords: [ "bart", "transportation", "vehicle" ], + "char": '\ud83d\ude8e', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + racing_car: { + keywords: [ "sports", "race", "fast", "formula", "f1" ], + "char": '\ud83c\udfce', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + police_car: { + keywords: [ "vehicle", "cars", "transportation", "law", "legal", "enforcement" ], + "char": '\ud83d\ude93', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ambulance: { + keywords: [ "health", "911", "hospital" ], + "char": '\ud83d\ude91', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fire_engine: { + keywords: [ "transportation", "cars", "vehicle" ], + "char": '\ud83d\ude92', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + minibus: { + keywords: [ "vehicle", "car", "transportation" ], + "char": '\ud83d\ude90', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + truck: { + keywords: [ "cars", "transportation" ], + "char": '\ud83d\ude9a', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + articulated_lorry: { + keywords: [ "vehicle", "cars", "transportation", "express" ], + "char": '\ud83d\ude9b', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tractor: { + keywords: [ "vehicle", "car", "farming", "agriculture" ], + "char": '\ud83d\ude9c', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + kick_scooter: { + keywords: [ "vehicle", "kick", "razor" ], + "char": '\ud83d\udef4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motorcycle: { + keywords: [ "race", "sports", "fast" ], + "char": '\ud83c\udfcd', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bike: { + keywords: [ "sports", "bicycle", "exercise", "hipster" ], + "char": '\ud83d\udeb2', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motor_scooter: { + keywords: [ "vehicle", "vespa", "sasha" ], + "char": '\ud83d\udef5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rotating_light: { + keywords: [ "police", "ambulance", "911", "emergency", "alert", "error", "pinged", "law", "legal" ], + "char": '\ud83d\udea8', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_police_car: { + keywords: [ "vehicle", "law", "legal", "enforcement", "911" ], + "char": '\ud83d\ude94', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_bus: { + keywords: [ "vehicle", "transportation" ], + "char": '\ud83d\ude8d', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_automobile: { + keywords: [ "car", "vehicle", "transportation" ], + "char": '\ud83d\ude98', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_taxi: { + keywords: [ "vehicle", "cars", "uber" ], + "char": '\ud83d\ude96', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + aerial_tramway: { + keywords: [ "transportation", "vehicle", "ski" ], + "char": '\ud83d\udea1', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_cableway: { + keywords: [ "transportation", "vehicle", "ski" ], + "char": '\ud83d\udea0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + suspension_railway: { + keywords: [ "vehicle", "transportation" ], + "char": '\ud83d\ude9f', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + railway_car: { + keywords: [ "transportation", "vehicle" ], + "char": '\ud83d\ude83', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + train: { + keywords: [ "transportation", "vehicle", "carriage", "public", "travel" ], + "char": '\ud83d\ude8b', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + monorail: { + keywords: [ "transportation", "vehicle" ], + "char": '\ud83d\ude9d', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bullettrain_side: { + keywords: [ "transportation", "vehicle" ], + "char": '\ud83d\ude84', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bullettrain_front: { + keywords: [ "transportation", "vehicle", "speed", "fast", "public", "travel" ], + "char": '\ud83d\ude85', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + light_rail: { + keywords: [ "transportation", "vehicle" ], + "char": '\ud83d\ude88', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_railway: { + keywords: [ "transportation", "vehicle" ], + "char": '\ud83d\ude9e', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + steam_locomotive: { + keywords: [ "transportation", "vehicle", "train" ], + "char": '\ud83d\ude82', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + train2: { + keywords: [ "transportation", "vehicle" ], + "char": '\ud83d\ude86', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + metro: { + keywords: [ "transportation", "blue-square", "mrt", "underground", "tube" ], + "char": '\ud83d\ude87', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tram: { + keywords: [ "transportation", "vehicle" ], + "char": '\ud83d\ude8a', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + station: { + keywords: [ "transportation", "vehicle", "public" ], + "char": '\ud83d\ude89', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flying_saucer: { + keywords: [ "transportation", "vehicle", "ufo" ], + "char": '\ud83d\udef8', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + helicopter: { + keywords: [ "transportation", "vehicle", "fly" ], + "char": '\ud83d\ude81', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + small_airplane: { + keywords: [ "flight", "transportation", "fly", "vehicle" ], + "char": '\ud83d\udee9', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + airplane: { + keywords: [ "vehicle", "transportation", "flight", "fly" ], + "char": '\u2708\ufe0f', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flight_departure: { + keywords: [ "airport", "flight", "landing" ], + "char": '\ud83d\udeeb', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flight_arrival: { + keywords: [ "airport", "flight", "boarding" ], + "char": '\ud83d\udeec', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sailboat: { + keywords: [ "ship", "summer", "transportation", "water", "sailing" ], + "char": '\u26f5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motor_boat: { + keywords: [ "ship" ], + "char": '\ud83d\udee5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + speedboat: { + keywords: [ "ship", "transportation", "vehicle", "summer" ], + "char": '\ud83d\udea4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ferry: { + keywords: [ "boat", "ship", "yacht" ], + "char": '\u26f4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + passenger_ship: { + keywords: [ "yacht", "cruise", "ferry" ], + "char": '\ud83d\udef3', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rocket: { + keywords: [ "launch", "ship", "staffmode", "NASA", "outer space", "outer_space", "fly" ], + "char": '\ud83d\ude80', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + artificial_satellite: { + keywords: [ "communication", "gps", "orbit", "spaceflight", "NASA", "ISS" ], + "char": '\ud83d\udef0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + seat: { + keywords: [ "sit", "airplane", "transport", "bus", "flight", "fly" ], + "char": '\ud83d\udcba', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + canoe: { + keywords: [ "boat", "paddle", "water", "ship" ], + "char": '\ud83d\udef6', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + anchor: { + keywords: [ "ship", "ferry", "sea", "boat" ], + "char": '\u2693', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + construction: { + keywords: [ "wip", "progress", "caution", "warning" ], + "char": '\ud83d\udea7', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fuelpump: { + keywords: [ "gas station", "petroleum" ], + "char": '\u26fd', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + busstop: { + keywords: [ "transportation", "wait" ], + "char": '\ud83d\ude8f', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + vertical_traffic_light: { + keywords: [ "transportation", "driving" ], + "char": '\ud83d\udea6', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + traffic_light: { + keywords: [ "transportation", "signal" ], + "char": '\ud83d\udea5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + checkered_flag: { + keywords: [ "contest", "finishline", "race", "gokart" ], + "char": '\ud83c\udfc1', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ship: { + keywords: [ "transportation", "titanic", "deploy" ], + "char": '\ud83d\udea2', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ferris_wheel: { + keywords: [ "photo", "carnival", "londoneye" ], + "char": '\ud83c\udfa1', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + roller_coaster: { + keywords: [ "carnival", "playground", "photo", "fun" ], + "char": '\ud83c\udfa2', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + carousel_horse: { + keywords: [ "photo", "carnival" ], + "char": '\ud83c\udfa0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + building_construction: { + keywords: [ "wip", "working", "progress" ], + "char": '\ud83c\udfd7', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + foggy: { + keywords: [ "photo", "mountain" ], + "char": '\ud83c\udf01', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tokyo_tower: { + keywords: [ "photo", "japanese" ], + "char": '\ud83d\uddfc', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + factory: { + keywords: [ "building", "industry", "pollution", "smoke" ], + "char": '\ud83c\udfed', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fountain: { + keywords: [ "photo", "summer", "water", "fresh" ], + "char": '\u26f2', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rice_scene: { + keywords: [ "photo", "japan", "asia", "tsukimi" ], + "char": '\ud83c\udf91', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain: { + keywords: [ "photo", "nature", "environment" ], + "char": '\u26f0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_snow: { + keywords: [ "photo", "nature", "environment", "winter", "cold" ], + "char": '\ud83c\udfd4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mount_fuji: { + keywords: [ "photo", "mountain", "nature", "japanese" ], + "char": '\ud83d\uddfb', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + volcano: { + keywords: [ "photo", "nature", "disaster" ], + "char": '\ud83c\udf0b', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + japan: { + keywords: [ "nation", "country", "japanese", "asia" ], + "char": '\ud83d\uddfe', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + camping: { + keywords: [ "photo", "outdoors", "tent" ], + "char": '\ud83c\udfd5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tent: { + keywords: [ "photo", "camping", "outdoors" ], + "char": '\u26fa', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + national_park: { + keywords: [ "photo", "environment", "nature" ], + "char": '\ud83c\udfde', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motorway: { + keywords: [ "road", "cupertino", "interstate", "highway" ], + "char": '\ud83d\udee3', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + railway_track: { + keywords: [ "train", "transportation" ], + "char": '\ud83d\udee4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sunrise: { + keywords: [ "morning", "view", "vacation", "photo" ], + "char": '\ud83c\udf05', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sunrise_over_mountains: { + keywords: [ "view", "vacation", "photo" ], + "char": '\ud83c\udf04', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + desert: { + keywords: [ "photo", "warm", "saharah" ], + "char": '\ud83c\udfdc', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + beach_umbrella: { + keywords: [ "weather", "summer", "sunny", "sand", "mojito" ], + "char": '\ud83c\udfd6', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + desert_island: { + keywords: [ "photo", "tropical", "mojito" ], + "char": '\ud83c\udfdd', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + city_sunrise: { + keywords: [ "photo", "good morning", "dawn" ], + "char": '\ud83c\udf07', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + city_sunset: { + keywords: [ "photo", "evening", "sky", "buildings" ], + "char": '\ud83c\udf06', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + cityscape: { + keywords: [ "photo", "night life", "urban" ], + "char": '\ud83c\udfd9', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + night_with_stars: { + keywords: [ "evening", "city", "downtown" ], + "char": '\ud83c\udf03', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bridge_at_night: { + keywords: [ "photo", "sanfrancisco" ], + "char": '\ud83c\udf09', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + milky_way: { + keywords: [ "photo", "space", "stars" ], + "char": '\ud83c\udf0c', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + stars: { + keywords: [ "night", "photo" ], + "char": '\ud83c\udf20', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sparkler: { + keywords: [ "stars", "night", "shine" ], + "char": '\ud83c\udf87', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fireworks: { + keywords: [ "photo", "festival", "carnival", "congratulations" ], + "char": '\ud83c\udf86', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rainbow: { + keywords: [ "nature", "happy", "unicorn_face", "photo", "sky", "spring" ], + "char": '\ud83c\udf08', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + houses: { + keywords: [ "buildings", "photo" ], + "char": '\ud83c\udfd8', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + european_castle: { + keywords: [ "building", "royalty", "history" ], + "char": '\ud83c\udff0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + japanese_castle: { + keywords: [ "photo", "building" ], + "char": '\ud83c\udfef', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + stadium: { + keywords: [ "photo", "place", "sports", "concert", "venue" ], + "char": '\ud83c\udfdf', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + statue_of_liberty: { + keywords: [ "american", "newyork" ], + "char": '\ud83d\uddfd', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + house: { + keywords: [ "building", "home" ], + "char": '\ud83c\udfe0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + house_with_garden: { + keywords: [ "home", "plant", "nature" ], + "char": '\ud83c\udfe1', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + derelict_house: { + keywords: [ "abandon", "evict", "broken", "building" ], + "char": '\ud83c\udfda', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + office: { + keywords: [ "building", "bureau", "work" ], + "char": '\ud83c\udfe2', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + department_store: { + keywords: [ "building", "shopping", "mall" ], + "char": '\ud83c\udfec', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + post_office: { + keywords: [ "building", "envelope", "communication" ], + "char": '\ud83c\udfe3', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + european_post_office: { + keywords: [ "building", "email" ], + "char": '\ud83c\udfe4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + hospital: { + keywords: [ "building", "health", "surgery", "doctor" ], + "char": '\ud83c\udfe5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bank: { + keywords: [ "building", "money", "sales", "cash", "business", "enterprise" ], + "char": '\ud83c\udfe6', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + hotel: { + keywords: [ "building", "accomodation", "checkin" ], + "char": '\ud83c\udfe8', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + convenience_store: { + keywords: [ "building", "shopping", "groceries" ], + "char": '\ud83c\udfea', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + school: { + keywords: [ "building", "student", "education", "learn", "teach" ], + "char": '\ud83c\udfeb', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + love_hotel: { + keywords: [ "like", "affection", "dating" ], + "char": '\ud83c\udfe9', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + wedding: { + keywords: [ "love", "like", "affection", "couple", "marriage", "bride", "groom" ], + "char": '\ud83d\udc92', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + classical_building: { + keywords: [ "art", "culture", "history" ], + "char": '\ud83c\udfdb', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + church: { + keywords: [ "building", "religion", "christ" ], + "char": '\u26ea', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mosque: { + keywords: [ "islam", "worship", "minaret" ], + "char": '\ud83d\udd4c', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + synagogue: { + keywords: [ "judaism", "worship", "temple", "jewish" ], + "char": '\ud83d\udd4d', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + kaaba: { + keywords: [ "mecca", "mosque", "islam" ], + "char": '\ud83d\udd4b', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + shinto_shrine: { + keywords: [ "temple", "japan", "kyoto" ], + "char": '\u26e9', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + watch: { + keywords: [ "time", "accessories" ], + "char": '\u231a', + fitzpatrick_scale: false, + category: "objects" + }, + iphone: { + keywords: [ "technology", "apple", "gadgets", "dial" ], + "char": '\ud83d\udcf1', + fitzpatrick_scale: false, + category: "objects" + }, + calling: { + keywords: [ "iphone", "incoming" ], + "char": '\ud83d\udcf2', + fitzpatrick_scale: false, + category: "objects" + }, + computer: { + keywords: [ "technology", "laptop", "screen", "display", "monitor" ], + "char": '\ud83d\udcbb', + fitzpatrick_scale: false, + category: "objects" + }, + keyboard: { + keywords: [ "technology", "computer", "type", "input", "text" ], + "char": '\u2328', + fitzpatrick_scale: false, + category: "objects" + }, + desktop_computer: { + keywords: [ "technology", "computing", "screen" ], + "char": '\ud83d\udda5', + fitzpatrick_scale: false, + category: "objects" + }, + printer: { + keywords: [ "paper", "ink" ], + "char": '\ud83d\udda8', + fitzpatrick_scale: false, + category: "objects" + }, + computer_mouse: { + keywords: [ "click" ], + "char": '\ud83d\uddb1', + fitzpatrick_scale: false, + category: "objects" + }, + trackball: { + keywords: [ "technology", "trackpad" ], + "char": '\ud83d\uddb2', + fitzpatrick_scale: false, + category: "objects" + }, + joystick: { + keywords: [ "game", "play" ], + "char": '\ud83d\udd79', + fitzpatrick_scale: false, + category: "objects" + }, + clamp: { + keywords: [ "tool" ], + "char": '\ud83d\udddc', + fitzpatrick_scale: false, + category: "objects" + }, + minidisc: { + keywords: [ "technology", "record", "data", "disk", "90s" ], + "char": '\ud83d\udcbd', + fitzpatrick_scale: false, + category: "objects" + }, + floppy_disk: { + keywords: [ "oldschool", "technology", "save", "90s", "80s" ], + "char": '\ud83d\udcbe', + fitzpatrick_scale: false, + category: "objects" + }, + cd: { + keywords: [ "technology", "dvd", "disk", "disc", "90s" ], + "char": '\ud83d\udcbf', + fitzpatrick_scale: false, + category: "objects" + }, + dvd: { + keywords: [ "cd", "disk", "disc" ], + "char": '\ud83d\udcc0', + fitzpatrick_scale: false, + category: "objects" + }, + vhs: { + keywords: [ "record", "video", "oldschool", "90s", "80s" ], + "char": '\ud83d\udcfc', + fitzpatrick_scale: false, + category: "objects" + }, + camera: { + keywords: [ "gadgets", "photography" ], + "char": '\ud83d\udcf7', + fitzpatrick_scale: false, + category: "objects" + }, + camera_flash: { + keywords: [ "photography", "gadgets" ], + "char": '\ud83d\udcf8', + fitzpatrick_scale: false, + category: "objects" + }, + video_camera: { + keywords: [ "film", "record" ], + "char": '\ud83d\udcf9', + fitzpatrick_scale: false, + category: "objects" + }, + movie_camera: { + keywords: [ "film", "record" ], + "char": '\ud83c\udfa5', + fitzpatrick_scale: false, + category: "objects" + }, + film_projector: { + keywords: [ "video", "tape", "record", "movie" ], + "char": '\ud83d\udcfd', + fitzpatrick_scale: false, + category: "objects" + }, + film_strip: { + keywords: [ "movie" ], + "char": '\ud83c\udf9e', + fitzpatrick_scale: false, + category: "objects" + }, + telephone_receiver: { + keywords: [ "technology", "communication", "dial" ], + "char": '\ud83d\udcde', + fitzpatrick_scale: false, + category: "objects" + }, + phone: { + keywords: [ "technology", "communication", "dial", "telephone" ], + "char": '\u260e\ufe0f', + fitzpatrick_scale: false, + category: "objects" + }, + pager: { + keywords: [ "bbcall", "oldschool", "90s" ], + "char": '\ud83d\udcdf', + fitzpatrick_scale: false, + category: "objects" + }, + fax: { + keywords: [ "communication", "technology" ], + "char": '\ud83d\udce0', + fitzpatrick_scale: false, + category: "objects" + }, + tv: { + keywords: [ "technology", "program", "oldschool", "show", "television" ], + "char": '\ud83d\udcfa', + fitzpatrick_scale: false, + category: "objects" + }, + radio: { + keywords: [ "communication", "music", "podcast", "program" ], + "char": '\ud83d\udcfb', + fitzpatrick_scale: false, + category: "objects" + }, + studio_microphone: { + keywords: [ "sing", "recording", "artist", "talkshow" ], + "char": '\ud83c\udf99', + fitzpatrick_scale: false, + category: "objects" + }, + level_slider: { + keywords: [ "scale" ], + "char": '\ud83c\udf9a', + fitzpatrick_scale: false, + category: "objects" + }, + control_knobs: { + keywords: [ "dial" ], + "char": '\ud83c\udf9b', + fitzpatrick_scale: false, + category: "objects" + }, + compass: { + keywords: [ "magnetic", "navigation", "orienteering" ], + "char": '\ud83e\udded', + fitzpatrick_scale: false, + category: "objects" + }, + stopwatch: { + keywords: [ "time", "deadline" ], + "char": '\u23f1', + fitzpatrick_scale: false, + category: "objects" + }, + timer_clock: { + keywords: [ "alarm" ], + "char": '\u23f2', + fitzpatrick_scale: false, + category: "objects" + }, + alarm_clock: { + keywords: [ "time", "wake" ], + "char": '\u23f0', + fitzpatrick_scale: false, + category: "objects" + }, + mantelpiece_clock: { + keywords: [ "time" ], + "char": '\ud83d\udd70', + fitzpatrick_scale: false, + category: "objects" + }, + hourglass_flowing_sand: { + keywords: [ "oldschool", "time", "countdown" ], + "char": '\u23f3', + fitzpatrick_scale: false, + category: "objects" + }, + hourglass: { + keywords: [ "time", "clock", "oldschool", "limit", "exam", "quiz", "test" ], + "char": '\u231b', + fitzpatrick_scale: false, + category: "objects" + }, + satellite: { + keywords: [ "communication", "future", "radio", "space" ], + "char": '\ud83d\udce1', + fitzpatrick_scale: false, + category: "objects" + }, + battery: { + keywords: [ "power", "energy", "sustain" ], + "char": '\ud83d\udd0b', + fitzpatrick_scale: false, + category: "objects" + }, + electric_plug: { + keywords: [ "charger", "power" ], + "char": '\ud83d\udd0c', + fitzpatrick_scale: false, + category: "objects" + }, + bulb: { + keywords: [ "light", "electricity", "idea" ], + "char": '\ud83d\udca1', + fitzpatrick_scale: false, + category: "objects" + }, + flashlight: { + keywords: [ "dark", "camping", "sight", "night" ], + "char": '\ud83d\udd26', + fitzpatrick_scale: false, + category: "objects" + }, + candle: { + keywords: [ "fire", "wax" ], + "char": '\ud83d\udd6f', + fitzpatrick_scale: false, + category: "objects" + }, + fire_extinguisher: { + keywords: [ "quench" ], + "char": '\ud83e\uddef', + fitzpatrick_scale: false, + category: "objects" + }, + wastebasket: { + keywords: [ "bin", "trash", "rubbish", "garbage", "toss" ], + "char": '\ud83d\uddd1', + fitzpatrick_scale: false, + category: "objects" + }, + oil_drum: { + keywords: [ "barrell" ], + "char": '\ud83d\udee2', + fitzpatrick_scale: false, + category: "objects" + }, + money_with_wings: { + keywords: [ "dollar", "bills", "payment", "sale" ], + "char": '\ud83d\udcb8', + fitzpatrick_scale: false, + category: "objects" + }, + dollar: { + keywords: [ "money", "sales", "bill", "currency" ], + "char": '\ud83d\udcb5', + fitzpatrick_scale: false, + category: "objects" + }, + yen: { + keywords: [ "money", "sales", "japanese", "dollar", "currency" ], + "char": '\ud83d\udcb4', + fitzpatrick_scale: false, + category: "objects" + }, + euro: { + keywords: [ "money", "sales", "dollar", "currency" ], + "char": '\ud83d\udcb6', + fitzpatrick_scale: false, + category: "objects" + }, + pound: { + keywords: [ "british", "sterling", "money", "sales", "bills", "uk", "england", "currency" ], + "char": '\ud83d\udcb7', + fitzpatrick_scale: false, + category: "objects" + }, + moneybag: { + keywords: [ "dollar", "payment", "coins", "sale" ], + "char": '\ud83d\udcb0', + fitzpatrick_scale: false, + category: "objects" + }, + credit_card: { + keywords: [ "money", "sales", "dollar", "bill", "payment", "shopping" ], + "char": '\ud83d\udcb3', + fitzpatrick_scale: false, + category: "objects" + }, + gem: { + keywords: [ "blue", "ruby", "diamond", "jewelry" ], + "char": '\ud83d\udc8e', + fitzpatrick_scale: false, + category: "objects" + }, + balance_scale: { + keywords: [ "law", "fairness", "weight" ], + "char": '\u2696', + fitzpatrick_scale: false, + category: "objects" + }, + toolbox: { + keywords: [ "tools", "diy", "fix", "maintainer", "mechanic" ], + "char": '\ud83e\uddf0', + fitzpatrick_scale: false, + category: "objects" + }, + wrench: { + keywords: [ "tools", "diy", "ikea", "fix", "maintainer" ], + "char": '\ud83d\udd27', + fitzpatrick_scale: false, + category: "objects" + }, + hammer: { + keywords: [ "tools", "build", "create" ], + "char": '\ud83d\udd28', + fitzpatrick_scale: false, + category: "objects" + }, + hammer_and_pick: { + keywords: [ "tools", "build", "create" ], + "char": '\u2692', + fitzpatrick_scale: false, + category: "objects" + }, + hammer_and_wrench: { + keywords: [ "tools", "build", "create" ], + "char": '\ud83d\udee0', + fitzpatrick_scale: false, + category: "objects" + }, + pick: { + keywords: [ "tools", "dig" ], + "char": '\u26cf', + fitzpatrick_scale: false, + category: "objects" + }, + nut_and_bolt: { + keywords: [ "handy", "tools", "fix" ], + "char": '\ud83d\udd29', + fitzpatrick_scale: false, + category: "objects" + }, + gear: { + keywords: [ "cog" ], + "char": '\u2699', + fitzpatrick_scale: false, + category: "objects" + }, + brick: { + keywords: [ "bricks" ], + "char": '\ud83e\uddf1', + fitzpatrick_scale: false, + category: "objects" + }, + chains: { + keywords: [ "lock", "arrest" ], + "char": '\u26d3', + fitzpatrick_scale: false, + category: "objects" + }, + magnet: { + keywords: [ "attraction", "magnetic" ], + "char": '\ud83e\uddf2', + fitzpatrick_scale: false, + category: "objects" + }, + gun: { + keywords: [ "violence", "weapon", "pistol", "revolver" ], + "char": '\ud83d\udd2b', + fitzpatrick_scale: false, + category: "objects" + }, + bomb: { + keywords: [ "boom", "explode", "explosion", "terrorism" ], + "char": '\ud83d\udca3', + fitzpatrick_scale: false, + category: "objects" + }, + firecracker: { + keywords: [ "dynamite", "boom", "explode", "explosion", "explosive" ], + "char": '\ud83e\udde8', + fitzpatrick_scale: false, + category: "objects" + }, + hocho: { + keywords: [ "knife", "blade", "cutlery", "kitchen", "weapon" ], + "char": '\ud83d\udd2a', + fitzpatrick_scale: false, + category: "objects" + }, + dagger: { + keywords: [ "weapon" ], + "char": '\ud83d\udde1', + fitzpatrick_scale: false, + category: "objects" + }, + crossed_swords: { + keywords: [ "weapon" ], + "char": '\u2694', + fitzpatrick_scale: false, + category: "objects" + }, + shield: { + keywords: [ "protection", "security" ], + "char": '\ud83d\udee1', + fitzpatrick_scale: false, + category: "objects" + }, + smoking: { + keywords: [ "kills", "tobacco", "cigarette", "joint", "smoke" ], + "char": '\ud83d\udeac', + fitzpatrick_scale: false, + category: "objects" + }, + skull_and_crossbones: { + keywords: [ "poison", "danger", "deadly", "scary", "death", "pirate", "evil" ], + "char": '\u2620', + fitzpatrick_scale: false, + category: "objects" + }, + coffin: { + keywords: [ "vampire", "dead", "die", "death", "rip", "graveyard", "cemetery", "casket", "funeral", "box" ], + "char": '\u26b0', + fitzpatrick_scale: false, + category: "objects" + }, + funeral_urn: { + keywords: [ "dead", "die", "death", "rip", "ashes" ], + "char": '\u26b1', + fitzpatrick_scale: false, + category: "objects" + }, + amphora: { + keywords: [ "vase", "jar" ], + "char": '\ud83c\udffa', + fitzpatrick_scale: false, + category: "objects" + }, + crystal_ball: { + keywords: [ "disco", "party", "magic", "circus", "fortune_teller" ], + "char": '\ud83d\udd2e', + fitzpatrick_scale: false, + category: "objects" + }, + prayer_beads: { + keywords: [ "dhikr", "religious" ], + "char": '\ud83d\udcff', + fitzpatrick_scale: false, + category: "objects" + }, + nazar_amulet: { + keywords: [ "bead", "charm" ], + "char": '\ud83e\uddff', + fitzpatrick_scale: false, + category: "objects" + }, + barber: { + keywords: [ "hair", "salon", "style" ], + "char": '\ud83d\udc88', + fitzpatrick_scale: false, + category: "objects" + }, + alembic: { + keywords: [ "distilling", "science", "experiment", "chemistry" ], + "char": '\u2697', + fitzpatrick_scale: false, + category: "objects" + }, + telescope: { + keywords: [ "stars", "space", "zoom", "science", "astronomy" ], + "char": '\ud83d\udd2d', + fitzpatrick_scale: false, + category: "objects" + }, + microscope: { + keywords: [ "laboratory", "experiment", "zoomin", "science", "study" ], + "char": '\ud83d\udd2c', + fitzpatrick_scale: false, + category: "objects" + }, + hole: { + keywords: [ "embarrassing" ], + "char": '\ud83d\udd73', + fitzpatrick_scale: false, + category: "objects" + }, + pill: { + keywords: [ "health", "medicine", "doctor", "pharmacy", "drug" ], + "char": '\ud83d\udc8a', + fitzpatrick_scale: false, + category: "objects" + }, + syringe: { + keywords: [ "health", "hospital", "drugs", "blood", "medicine", "needle", "doctor", "nurse" ], + "char": '\ud83d\udc89', + fitzpatrick_scale: false, + category: "objects" + }, + dna: { + keywords: [ "biologist", "genetics", "life" ], + "char": '\ud83e\uddec', + fitzpatrick_scale: false, + category: "objects" + }, + microbe: { + keywords: [ "amoeba", "bacteria", "germs" ], + "char": '\ud83e\udda0', + fitzpatrick_scale: false, + category: "objects" + }, + petri_dish: { + keywords: [ "bacteria", "biology", "culture", "lab" ], + "char": '\ud83e\uddeb', + fitzpatrick_scale: false, + category: "objects" + }, + test_tube: { + keywords: [ "chemistry", "experiment", "lab", "science" ], + "char": '\ud83e\uddea', + fitzpatrick_scale: false, + category: "objects" + }, + thermometer: { + keywords: [ "weather", "temperature", "hot", "cold" ], + "char": '\ud83c\udf21', + fitzpatrick_scale: false, + category: "objects" + }, + broom: { + keywords: [ "cleaning", "sweeping", "witch" ], + "char": '\ud83e\uddf9', + fitzpatrick_scale: false, + category: "objects" + }, + basket: { + keywords: [ "laundry" ], + "char": '\ud83e\uddfa', + fitzpatrick_scale: false, + category: "objects" + }, + toilet_paper: { + keywords: [ "roll" ], + "char": '\ud83e\uddfb', + fitzpatrick_scale: false, + category: "objects" + }, + label: { + keywords: [ "sale", "tag" ], + "char": '\ud83c\udff7', + fitzpatrick_scale: false, + category: "objects" + }, + bookmark: { + keywords: [ "favorite", "label", "save" ], + "char": '\ud83d\udd16', + fitzpatrick_scale: false, + category: "objects" + }, + toilet: { + keywords: [ "restroom", "wc", "washroom", "bathroom", "potty" ], + "char": '\ud83d\udebd', + fitzpatrick_scale: false, + category: "objects" + }, + shower: { + keywords: [ "clean", "water", "bathroom" ], + "char": '\ud83d\udebf', + fitzpatrick_scale: false, + category: "objects" + }, + bathtub: { + keywords: [ "clean", "shower", "bathroom" ], + "char": '\ud83d\udec1', + fitzpatrick_scale: false, + category: "objects" + }, + soap: { + keywords: [ "bar", "bathing", "cleaning", "lather" ], + "char": '\ud83e\uddfc', + fitzpatrick_scale: false, + category: "objects" + }, + sponge: { + keywords: [ "absorbing", "cleaning", "porous" ], + "char": '\ud83e\uddfd', + fitzpatrick_scale: false, + category: "objects" + }, + lotion_bottle: { + keywords: [ "moisturizer", "sunscreen" ], + "char": '\ud83e\uddf4', + fitzpatrick_scale: false, + category: "objects" + }, + key: { + keywords: [ "lock", "door", "password" ], + "char": '\ud83d\udd11', + fitzpatrick_scale: false, + category: "objects" + }, + old_key: { + keywords: [ "lock", "door", "password" ], + "char": '\ud83d\udddd', + fitzpatrick_scale: false, + category: "objects" + }, + couch_and_lamp: { + keywords: [ "read", "chill" ], + "char": '\ud83d\udecb', + fitzpatrick_scale: false, + category: "objects" + }, + sleeping_bed: { + keywords: [ "bed", "rest" ], + "char": '\ud83d\udecc', + fitzpatrick_scale: true, + category: "objects" + }, + bed: { + keywords: [ "sleep", "rest" ], + "char": '\ud83d\udecf', + fitzpatrick_scale: false, + category: "objects" + }, + door: { + keywords: [ "house", "entry", "exit" ], + "char": '\ud83d\udeaa', + fitzpatrick_scale: false, + category: "objects" + }, + bellhop_bell: { + keywords: [ "service" ], + "char": '\ud83d\udece', + fitzpatrick_scale: false, + category: "objects" + }, + teddy_bear: { + keywords: [ "plush", "stuffed" ], + "char": '\ud83e\uddf8', + fitzpatrick_scale: false, + category: "objects" + }, + framed_picture: { + keywords: [ "photography" ], + "char": '\ud83d\uddbc', + fitzpatrick_scale: false, + category: "objects" + }, + world_map: { + keywords: [ "location", "direction" ], + "char": '\ud83d\uddfa', + fitzpatrick_scale: false, + category: "objects" + }, + parasol_on_ground: { + keywords: [ "weather", "summer" ], + "char": '\u26f1', + fitzpatrick_scale: false, + category: "objects" + }, + moyai: { + keywords: [ "rock", "easter island", "moai" ], + "char": '\ud83d\uddff', + fitzpatrick_scale: false, + category: "objects" + }, + shopping: { + keywords: [ "mall", "buy", "purchase" ], + "char": '\ud83d\udecd', + fitzpatrick_scale: false, + category: "objects" + }, + shopping_cart: { + keywords: [ "trolley" ], + "char": '\ud83d\uded2', + fitzpatrick_scale: false, + category: "objects" + }, + balloon: { + keywords: [ "party", "celebration", "birthday", "circus" ], + "char": '\ud83c\udf88', + fitzpatrick_scale: false, + category: "objects" + }, + flags: { + keywords: [ "fish", "japanese", "koinobori", "carp", "banner" ], + "char": '\ud83c\udf8f', + fitzpatrick_scale: false, + category: "objects" + }, + ribbon: { + keywords: [ "decoration", "pink", "girl", "bowtie" ], + "char": '\ud83c\udf80', + fitzpatrick_scale: false, + category: "objects" + }, + gift: { + keywords: [ "present", "birthday", "christmas", "xmas" ], + "char": '\ud83c\udf81', + fitzpatrick_scale: false, + category: "objects" + }, + confetti_ball: { + keywords: [ "festival", "party", "birthday", "circus" ], + "char": '\ud83c\udf8a', + fitzpatrick_scale: false, + category: "objects" + }, + tada: { + keywords: [ "party", "congratulations", "birthday", "magic", "circus", "celebration" ], + "char": '\ud83c\udf89', + fitzpatrick_scale: false, + category: "objects" + }, + dolls: { + keywords: [ "japanese", "toy", "kimono" ], + "char": '\ud83c\udf8e', + fitzpatrick_scale: false, + category: "objects" + }, + wind_chime: { + keywords: [ "nature", "ding", "spring", "bell" ], + "char": '\ud83c\udf90', + fitzpatrick_scale: false, + category: "objects" + }, + crossed_flags: { + keywords: [ "japanese", "nation", "country", "border" ], + "char": '\ud83c\udf8c', + fitzpatrick_scale: false, + category: "objects" + }, + izakaya_lantern: { + keywords: [ "light", "paper", "halloween", "spooky" ], + "char": '\ud83c\udfee', + fitzpatrick_scale: false, + category: "objects" + }, + red_envelope: { + keywords: [ "gift" ], + "char": '\ud83e\udde7', + fitzpatrick_scale: false, + category: "objects" + }, + email: { + keywords: [ "letter", "postal", "inbox", "communication" ], + "char": '\u2709\ufe0f', + fitzpatrick_scale: false, + category: "objects" + }, + envelope_with_arrow: { + keywords: [ "email", "communication" ], + "char": '\ud83d\udce9', + fitzpatrick_scale: false, + category: "objects" + }, + incoming_envelope: { + keywords: [ "email", "inbox" ], + "char": '\ud83d\udce8', + fitzpatrick_scale: false, + category: "objects" + }, + "e-mail": { + keywords: [ "communication", "inbox" ], + "char": '\ud83d\udce7', + fitzpatrick_scale: false, + category: "objects" + }, + love_letter: { + keywords: [ "email", "like", "affection", "envelope", "valentines" ], + "char": '\ud83d\udc8c', + fitzpatrick_scale: false, + category: "objects" + }, + postbox: { + keywords: [ "email", "letter", "envelope" ], + "char": '\ud83d\udcee', + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_closed: { + keywords: [ "email", "communication", "inbox" ], + "char": '\ud83d\udcea', + fitzpatrick_scale: false, + category: "objects" + }, + mailbox: { + keywords: [ "email", "inbox", "communication" ], + "char": '\ud83d\udceb', + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_with_mail: { + keywords: [ "email", "inbox", "communication" ], + "char": '\ud83d\udcec', + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_with_no_mail: { + keywords: [ "email", "inbox" ], + "char": '\ud83d\udced', + fitzpatrick_scale: false, + category: "objects" + }, + "package": { + keywords: [ "mail", "gift", "cardboard", "box", "moving" ], + "char": '\ud83d\udce6', + fitzpatrick_scale: false, + category: "objects" + }, + postal_horn: { + keywords: [ "instrument", "music" ], + "char": '\ud83d\udcef', + fitzpatrick_scale: false, + category: "objects" + }, + inbox_tray: { + keywords: [ "email", "documents" ], + "char": '\ud83d\udce5', + fitzpatrick_scale: false, + category: "objects" + }, + outbox_tray: { + keywords: [ "inbox", "email" ], + "char": '\ud83d\udce4', + fitzpatrick_scale: false, + category: "objects" + }, + scroll: { + keywords: [ "documents", "ancient", "history", "paper" ], + "char": '\ud83d\udcdc', + fitzpatrick_scale: false, + category: "objects" + }, + page_with_curl: { + keywords: [ "documents", "office", "paper" ], + "char": '\ud83d\udcc3', + fitzpatrick_scale: false, + category: "objects" + }, + bookmark_tabs: { + keywords: [ "favorite", "save", "order", "tidy" ], + "char": '\ud83d\udcd1', + fitzpatrick_scale: false, + category: "objects" + }, + receipt: { + keywords: [ "accounting", "expenses" ], + "char": '\ud83e\uddfe', + fitzpatrick_scale: false, + category: "objects" + }, + bar_chart: { + keywords: [ "graph", "presentation", "stats" ], + "char": '\ud83d\udcca', + fitzpatrick_scale: false, + category: "objects" + }, + chart_with_upwards_trend: { + keywords: [ "graph", "presentation", "stats", "recovery", "business", "economics", "money", "sales", "good", "success" ], + "char": '\ud83d\udcc8', + fitzpatrick_scale: false, + category: "objects" + }, + chart_with_downwards_trend: { + keywords: [ "graph", "presentation", "stats", "recession", "business", "economics", "money", "sales", "bad", "failure" ], + "char": '\ud83d\udcc9', + fitzpatrick_scale: false, + category: "objects" + }, + page_facing_up: { + keywords: [ "documents", "office", "paper", "information" ], + "char": '\ud83d\udcc4', + fitzpatrick_scale: false, + category: "objects" + }, + date: { + keywords: [ "calendar", "schedule" ], + "char": '\ud83d\udcc5', + fitzpatrick_scale: false, + category: "objects" + }, + calendar: { + keywords: [ "schedule", "date", "planning" ], + "char": '\ud83d\udcc6', + fitzpatrick_scale: false, + category: "objects" + }, + spiral_calendar: { + keywords: [ "date", "schedule", "planning" ], + "char": '\ud83d\uddd3', + fitzpatrick_scale: false, + category: "objects" + }, + card_index: { + keywords: [ "business", "stationery" ], + "char": '\ud83d\udcc7', + fitzpatrick_scale: false, + category: "objects" + }, + card_file_box: { + keywords: [ "business", "stationery" ], + "char": '\ud83d\uddc3', + fitzpatrick_scale: false, + category: "objects" + }, + ballot_box: { + keywords: [ "election", "vote" ], + "char": '\ud83d\uddf3', + fitzpatrick_scale: false, + category: "objects" + }, + file_cabinet: { + keywords: [ "filing", "organizing" ], + "char": '\ud83d\uddc4', + fitzpatrick_scale: false, + category: "objects" + }, + clipboard: { + keywords: [ "stationery", "documents" ], + "char": '\ud83d\udccb', + fitzpatrick_scale: false, + category: "objects" + }, + spiral_notepad: { + keywords: [ "memo", "stationery" ], + "char": '\ud83d\uddd2', + fitzpatrick_scale: false, + category: "objects" + }, + file_folder: { + keywords: [ "documents", "business", "office" ], + "char": '\ud83d\udcc1', + fitzpatrick_scale: false, + category: "objects" + }, + open_file_folder: { + keywords: [ "documents", "load" ], + "char": '\ud83d\udcc2', + fitzpatrick_scale: false, + category: "objects" + }, + card_index_dividers: { + keywords: [ "organizing", "business", "stationery" ], + "char": '\ud83d\uddc2', + fitzpatrick_scale: false, + category: "objects" + }, + newspaper_roll: { + keywords: [ "press", "headline" ], + "char": '\ud83d\uddde', + fitzpatrick_scale: false, + category: "objects" + }, + newspaper: { + keywords: [ "press", "headline" ], + "char": '\ud83d\udcf0', + fitzpatrick_scale: false, + category: "objects" + }, + notebook: { + keywords: [ "stationery", "record", "notes", "paper", "study" ], + "char": '\ud83d\udcd3', + fitzpatrick_scale: false, + category: "objects" + }, + closed_book: { + keywords: [ "read", "library", "knowledge", "textbook", "learn" ], + "char": '\ud83d\udcd5', + fitzpatrick_scale: false, + category: "objects" + }, + green_book: { + keywords: [ "read", "library", "knowledge", "study" ], + "char": '\ud83d\udcd7', + fitzpatrick_scale: false, + category: "objects" + }, + blue_book: { + keywords: [ "read", "library", "knowledge", "learn", "study" ], + "char": '\ud83d\udcd8', + fitzpatrick_scale: false, + category: "objects" + }, + orange_book: { + keywords: [ "read", "library", "knowledge", "textbook", "study" ], + "char": '\ud83d\udcd9', + fitzpatrick_scale: false, + category: "objects" + }, + notebook_with_decorative_cover: { + keywords: [ "classroom", "notes", "record", "paper", "study" ], + "char": '\ud83d\udcd4', + fitzpatrick_scale: false, + category: "objects" + }, + ledger: { + keywords: [ "notes", "paper" ], + "char": '\ud83d\udcd2', + fitzpatrick_scale: false, + category: "objects" + }, + books: { + keywords: [ "literature", "library", "study" ], + "char": '\ud83d\udcda', + fitzpatrick_scale: false, + category: "objects" + }, + open_book: { + keywords: [ "book", "read", "library", "knowledge", "literature", "learn", "study" ], + "char": '\ud83d\udcd6', + fitzpatrick_scale: false, + category: "objects" + }, + safety_pin: { + keywords: [ "diaper" ], + "char": '\ud83e\uddf7', + fitzpatrick_scale: false, + category: "objects" + }, + link: { + keywords: [ "rings", "url" ], + "char": '\ud83d\udd17', + fitzpatrick_scale: false, + category: "objects" + }, + paperclip: { + keywords: [ "documents", "stationery" ], + "char": '\ud83d\udcce', + fitzpatrick_scale: false, + category: "objects" + }, + paperclips: { + keywords: [ "documents", "stationery" ], + "char": '\ud83d\udd87', + fitzpatrick_scale: false, + category: "objects" + }, + scissors: { + keywords: [ "stationery", "cut" ], + "char": '\u2702\ufe0f', + fitzpatrick_scale: false, + category: "objects" + }, + triangular_ruler: { + keywords: [ "stationery", "math", "architect", "sketch" ], + "char": '\ud83d\udcd0', + fitzpatrick_scale: false, + category: "objects" + }, + straight_ruler: { + keywords: [ "stationery", "calculate", "length", "math", "school", "drawing", "architect", "sketch" ], + "char": '\ud83d\udccf', + fitzpatrick_scale: false, + category: "objects" + }, + abacus: { + keywords: [ "calculation" ], + "char": '\ud83e\uddee', + fitzpatrick_scale: false, + category: "objects" + }, + pushpin: { + keywords: [ "stationery", "mark", "here" ], + "char": '\ud83d\udccc', + fitzpatrick_scale: false, + category: "objects" + }, + round_pushpin: { + keywords: [ "stationery", "location", "map", "here" ], + "char": '\ud83d\udccd', + fitzpatrick_scale: false, + category: "objects" + }, + triangular_flag_on_post: { + keywords: [ "mark", "milestone", "place" ], + "char": '\ud83d\udea9', + fitzpatrick_scale: false, + category: "objects" + }, + white_flag: { + keywords: [ "losing", "loser", "lost", "surrender", "give up", "fail" ], + "char": '\ud83c\udff3', + fitzpatrick_scale: false, + category: "objects" + }, + black_flag: { + keywords: [ "pirate" ], + "char": '\ud83c\udff4', + fitzpatrick_scale: false, + category: "objects" + }, + rainbow_flag: { + keywords: [ "flag", "rainbow", "pride", "gay", "lgbt", "glbt", "queer", "homosexual", "lesbian", "bisexual", "transgender" ], + "char": '\ud83c\udff3\ufe0f\u200d\ud83c\udf08', + fitzpatrick_scale: false, + category: "objects" + }, + closed_lock_with_key: { + keywords: [ "security", "privacy" ], + "char": '\ud83d\udd10', + fitzpatrick_scale: false, + category: "objects" + }, + lock: { + keywords: [ "security", "password", "padlock" ], + "char": '\ud83d\udd12', + fitzpatrick_scale: false, + category: "objects" + }, + unlock: { + keywords: [ "privacy", "security" ], + "char": '\ud83d\udd13', + fitzpatrick_scale: false, + category: "objects" + }, + lock_with_ink_pen: { + keywords: [ "security", "secret" ], + "char": '\ud83d\udd0f', + fitzpatrick_scale: false, + category: "objects" + }, + pen: { + keywords: [ "stationery", "writing", "write" ], + "char": '\ud83d\udd8a', + fitzpatrick_scale: false, + category: "objects" + }, + fountain_pen: { + keywords: [ "stationery", "writing", "write" ], + "char": '\ud83d\udd8b', + fitzpatrick_scale: false, + category: "objects" + }, + black_nib: { + keywords: [ "pen", "stationery", "writing", "write" ], + "char": '\u2712\ufe0f', + fitzpatrick_scale: false, + category: "objects" + }, + memo: { + keywords: [ "write", "documents", "stationery", "pencil", "paper", "writing", "legal", "exam", "quiz", "test", "study", "compose" ], + "char": '\ud83d\udcdd', + fitzpatrick_scale: false, + category: "objects" + }, + pencil2: { + keywords: [ "stationery", "write", "paper", "writing", "school", "study" ], + "char": '\u270f\ufe0f', + fitzpatrick_scale: false, + category: "objects" + }, + crayon: { + keywords: [ "drawing", "creativity" ], + "char": '\ud83d\udd8d', + fitzpatrick_scale: false, + category: "objects" + }, + paintbrush: { + keywords: [ "drawing", "creativity", "art" ], + "char": '\ud83d\udd8c', + fitzpatrick_scale: false, + category: "objects" + }, + mag: { + keywords: [ "search", "zoom", "find", "detective" ], + "char": '\ud83d\udd0d', + fitzpatrick_scale: false, + category: "objects" + }, + mag_right: { + keywords: [ "search", "zoom", "find", "detective" ], + "char": '\ud83d\udd0e', + fitzpatrick_scale: false, + category: "objects" + }, + heart: { + keywords: [ "love", "like", "valentines" ], + "char": '\u2764\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + orange_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": '\ud83e\udde1', + fitzpatrick_scale: false, + category: "symbols" + }, + yellow_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": '\ud83d\udc9b', + fitzpatrick_scale: false, + category: "symbols" + }, + green_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": '\ud83d\udc9a', + fitzpatrick_scale: false, + category: "symbols" + }, + blue_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": '\ud83d\udc99', + fitzpatrick_scale: false, + category: "symbols" + }, + purple_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": '\ud83d\udc9c', + fitzpatrick_scale: false, + category: "symbols" + }, + black_heart: { + keywords: [ "evil" ], + "char": '\ud83d\udda4', + fitzpatrick_scale: false, + category: "symbols" + }, + broken_heart: { + keywords: [ "sad", "sorry", "break", "heart", "heartbreak" ], + "char": '\ud83d\udc94', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_heart_exclamation: { + keywords: [ "decoration", "love" ], + "char": '\u2763', + fitzpatrick_scale: false, + category: "symbols" + }, + two_hearts: { + keywords: [ "love", "like", "affection", "valentines", "heart" ], + "char": '\ud83d\udc95', + fitzpatrick_scale: false, + category: "symbols" + }, + revolving_hearts: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": '\ud83d\udc9e', + fitzpatrick_scale: false, + category: "symbols" + }, + heartbeat: { + keywords: [ "love", "like", "affection", "valentines", "pink", "heart" ], + "char": '\ud83d\udc93', + fitzpatrick_scale: false, + category: "symbols" + }, + heartpulse: { + keywords: [ "like", "love", "affection", "valentines", "pink" ], + "char": '\ud83d\udc97', + fitzpatrick_scale: false, + category: "symbols" + }, + sparkling_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": '\ud83d\udc96', + fitzpatrick_scale: false, + category: "symbols" + }, + cupid: { + keywords: [ "love", "like", "heart", "affection", "valentines" ], + "char": '\ud83d\udc98', + fitzpatrick_scale: false, + category: "symbols" + }, + gift_heart: { + keywords: [ "love", "valentines" ], + "char": '\ud83d\udc9d', + fitzpatrick_scale: false, + category: "symbols" + }, + heart_decoration: { + keywords: [ "purple-square", "love", "like" ], + "char": '\ud83d\udc9f', + fitzpatrick_scale: false, + category: "symbols" + }, + peace_symbol: { + keywords: [ "hippie" ], + "char": '\u262e', + fitzpatrick_scale: false, + category: "symbols" + }, + latin_cross: { + keywords: [ "christianity" ], + "char": '\u271d', + fitzpatrick_scale: false, + category: "symbols" + }, + star_and_crescent: { + keywords: [ "islam" ], + "char": '\u262a', + fitzpatrick_scale: false, + category: "symbols" + }, + om: { + keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ], + "char": '\ud83d\udd49', + fitzpatrick_scale: false, + category: "symbols" + }, + wheel_of_dharma: { + keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ], + "char": '\u2638', + fitzpatrick_scale: false, + category: "symbols" + }, + star_of_david: { + keywords: [ "judaism" ], + "char": '\u2721', + fitzpatrick_scale: false, + category: "symbols" + }, + six_pointed_star: { + keywords: [ "purple-square", "religion", "jewish", "hexagram" ], + "char": '\ud83d\udd2f', + fitzpatrick_scale: false, + category: "symbols" + }, + menorah: { + keywords: [ "hanukkah", "candles", "jewish" ], + "char": '\ud83d\udd4e', + fitzpatrick_scale: false, + category: "symbols" + }, + yin_yang: { + keywords: [ "balance" ], + "char": '\u262f', + fitzpatrick_scale: false, + category: "symbols" + }, + orthodox_cross: { + keywords: [ "suppedaneum", "religion" ], + "char": '\u2626', + fitzpatrick_scale: false, + category: "symbols" + }, + place_of_worship: { + keywords: [ "religion", "church", "temple", "prayer" ], + "char": '\ud83d\uded0', + fitzpatrick_scale: false, + category: "symbols" + }, + ophiuchus: { + keywords: [ "sign", "purple-square", "constellation", "astrology" ], + "char": '\u26ce', + fitzpatrick_scale: false, + category: "symbols" + }, + aries: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + "char": '\u2648', + fitzpatrick_scale: false, + category: "symbols" + }, + taurus: { + keywords: [ "purple-square", "sign", "zodiac", "astrology" ], + "char": '\u2649', + fitzpatrick_scale: false, + category: "symbols" + }, + gemini: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + "char": '\u264a', + fitzpatrick_scale: false, + category: "symbols" + }, + cancer: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + "char": '\u264b', + fitzpatrick_scale: false, + category: "symbols" + }, + leo: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + "char": '\u264c', + fitzpatrick_scale: false, + category: "symbols" + }, + virgo: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + "char": '\u264d', + fitzpatrick_scale: false, + category: "symbols" + }, + libra: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + "char": '\u264e', + fitzpatrick_scale: false, + category: "symbols" + }, + scorpius: { + keywords: [ "sign", "zodiac", "purple-square", "astrology", "scorpio" ], + "char": '\u264f', + fitzpatrick_scale: false, + category: "symbols" + }, + sagittarius: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + "char": '\u2650', + fitzpatrick_scale: false, + category: "symbols" + }, + capricorn: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + "char": '\u2651', + fitzpatrick_scale: false, + category: "symbols" + }, + aquarius: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + "char": '\u2652', + fitzpatrick_scale: false, + category: "symbols" + }, + pisces: { + keywords: [ "purple-square", "sign", "zodiac", "astrology" ], + "char": '\u2653', + fitzpatrick_scale: false, + category: "symbols" + }, + id: { + keywords: [ "purple-square", "words" ], + "char": '\ud83c\udd94', + fitzpatrick_scale: false, + category: "symbols" + }, + atom_symbol: { + keywords: [ "science", "physics", "chemistry" ], + "char": '\u269b', + fitzpatrick_scale: false, + category: "symbols" + }, + u7a7a: { + keywords: [ "kanji", "japanese", "chinese", "empty", "sky", "blue-square" ], + "char": '\ud83c\ude33', + fitzpatrick_scale: false, + category: "symbols" + }, + u5272: { + keywords: [ "cut", "divide", "chinese", "kanji", "pink-square" ], + "char": '\ud83c\ude39', + fitzpatrick_scale: false, + category: "symbols" + }, + radioactive: { + keywords: [ "nuclear", "danger" ], + "char": '\u2622', + fitzpatrick_scale: false, + category: "symbols" + }, + biohazard: { + keywords: [ "danger" ], + "char": '\u2623', + fitzpatrick_scale: false, + category: "symbols" + }, + mobile_phone_off: { + keywords: [ "mute", "orange-square", "silence", "quiet" ], + "char": '\ud83d\udcf4', + fitzpatrick_scale: false, + category: "symbols" + }, + vibration_mode: { + keywords: [ "orange-square", "phone" ], + "char": '\ud83d\udcf3', + fitzpatrick_scale: false, + category: "symbols" + }, + u6709: { + keywords: [ "orange-square", "chinese", "have", "kanji" ], + "char": '\ud83c\ude36', + fitzpatrick_scale: false, + category: "symbols" + }, + u7121: { + keywords: [ "nothing", "chinese", "kanji", "japanese", "orange-square" ], + "char": '\ud83c\ude1a', + fitzpatrick_scale: false, + category: "symbols" + }, + u7533: { + keywords: [ "chinese", "japanese", "kanji", "orange-square" ], + "char": '\ud83c\ude38', + fitzpatrick_scale: false, + category: "symbols" + }, + u55b6: { + keywords: [ "japanese", "opening hours", "orange-square" ], + "char": '\ud83c\ude3a', + fitzpatrick_scale: false, + category: "symbols" + }, + u6708: { + keywords: [ "chinese", "month", "moon", "japanese", "orange-square", "kanji" ], + "char": '\ud83c\ude37\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + eight_pointed_black_star: { + keywords: [ "orange-square", "shape", "polygon" ], + "char": '\u2734\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + vs: { + keywords: [ "words", "orange-square" ], + "char": '\ud83c\udd9a', + fitzpatrick_scale: false, + category: "symbols" + }, + accept: { + keywords: [ "ok", "good", "chinese", "kanji", "agree", "yes", "orange-circle" ], + "char": '\ud83c\ude51', + fitzpatrick_scale: false, + category: "symbols" + }, + white_flower: { + keywords: [ "japanese", "spring" ], + "char": '\ud83d\udcae', + fitzpatrick_scale: false, + category: "symbols" + }, + ideograph_advantage: { + keywords: [ "chinese", "kanji", "obtain", "get", "circle" ], + "char": '\ud83c\ude50', + fitzpatrick_scale: false, + category: "symbols" + }, + secret: { + keywords: [ "privacy", "chinese", "sshh", "kanji", "red-circle" ], + "char": '\u3299\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + congratulations: { + keywords: [ "chinese", "kanji", "japanese", "red-circle" ], + "char": '\u3297\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + u5408: { + keywords: [ "japanese", "chinese", "join", "kanji", "red-square" ], + "char": '\ud83c\ude34', + fitzpatrick_scale: false, + category: "symbols" + }, + u6e80: { + keywords: [ "full", "chinese", "japanese", "red-square", "kanji" ], + "char": '\ud83c\ude35', + fitzpatrick_scale: false, + category: "symbols" + }, + u7981: { + keywords: [ "kanji", "japanese", "chinese", "forbidden", "limit", "restricted", "red-square" ], + "char": '\ud83c\ude32', + fitzpatrick_scale: false, + category: "symbols" + }, + a: { + keywords: [ "red-square", "alphabet", "letter" ], + "char": '\ud83c\udd70\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + b: { + keywords: [ "red-square", "alphabet", "letter" ], + "char": '\ud83c\udd71\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + ab: { + keywords: [ "red-square", "alphabet" ], + "char": '\ud83c\udd8e', + fitzpatrick_scale: false, + category: "symbols" + }, + cl: { + keywords: [ "alphabet", "words", "red-square" ], + "char": '\ud83c\udd91', + fitzpatrick_scale: false, + category: "symbols" + }, + o2: { + keywords: [ "alphabet", "red-square", "letter" ], + "char": '\ud83c\udd7e\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + sos: { + keywords: [ "help", "red-square", "words", "emergency", "911" ], + "char": '\ud83c\udd98', + fitzpatrick_scale: false, + category: "symbols" + }, + no_entry: { + keywords: [ "limit", "security", "privacy", "bad", "denied", "stop", "circle" ], + "char": '\u26d4', + fitzpatrick_scale: false, + category: "symbols" + }, + name_badge: { + keywords: [ "fire", "forbid" ], + "char": '\ud83d\udcdb', + fitzpatrick_scale: false, + category: "symbols" + }, + no_entry_sign: { + keywords: [ "forbid", "stop", "limit", "denied", "disallow", "circle" ], + "char": '\ud83d\udeab', + fitzpatrick_scale: false, + category: "symbols" + }, + x: { + keywords: [ "no", "delete", "remove", "cancel", "red" ], + "char": '\u274c', + fitzpatrick_scale: false, + category: "symbols" + }, + o: { + keywords: [ "circle", "round" ], + "char": '\u2b55', + fitzpatrick_scale: false, + category: "symbols" + }, + stop_sign: { + keywords: [ "stop" ], + "char": '\ud83d\uded1', + fitzpatrick_scale: false, + category: "symbols" + }, + anger: { + keywords: [ "angry", "mad" ], + "char": '\ud83d\udca2', + fitzpatrick_scale: false, + category: "symbols" + }, + hotsprings: { + keywords: [ "bath", "warm", "relax" ], + "char": '\u2668\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + no_pedestrians: { + keywords: [ "rules", "crossing", "walking", "circle" ], + "char": '\ud83d\udeb7', + fitzpatrick_scale: false, + category: "symbols" + }, + do_not_litter: { + keywords: [ "trash", "bin", "garbage", "circle" ], + "char": '\ud83d\udeaf', + fitzpatrick_scale: false, + category: "symbols" + }, + no_bicycles: { + keywords: [ "cyclist", "prohibited", "circle" ], + "char": '\ud83d\udeb3', + fitzpatrick_scale: false, + category: "symbols" + }, + "non-potable_water": { + keywords: [ "drink", "faucet", "tap", "circle" ], + "char": '\ud83d\udeb1', + fitzpatrick_scale: false, + category: "symbols" + }, + underage: { + keywords: [ "18", "drink", "pub", "night", "minor", "circle" ], + "char": '\ud83d\udd1e', + fitzpatrick_scale: false, + category: "symbols" + }, + no_mobile_phones: { + keywords: [ "iphone", "mute", "circle" ], + "char": '\ud83d\udcf5', + fitzpatrick_scale: false, + category: "symbols" + }, + exclamation: { + keywords: [ "heavy_exclamation_mark", "danger", "surprise", "punctuation", "wow", "warning" ], + "char": '\u2757', + fitzpatrick_scale: false, + category: "symbols" + }, + grey_exclamation: { + keywords: [ "surprise", "punctuation", "gray", "wow", "warning" ], + "char": '\u2755', + fitzpatrick_scale: false, + category: "symbols" + }, + question: { + keywords: [ "doubt", "confused" ], + "char": '\u2753', + fitzpatrick_scale: false, + category: "symbols" + }, + grey_question: { + keywords: [ "doubts", "gray", "huh", "confused" ], + "char": '\u2754', + fitzpatrick_scale: false, + category: "symbols" + }, + bangbang: { + keywords: [ "exclamation", "surprise" ], + "char": '\u203c\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + interrobang: { + keywords: [ "wat", "punctuation", "surprise" ], + "char": '\u2049\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + low_brightness: { + keywords: [ "sun", "afternoon", "warm", "summer" ], + "char": '\ud83d\udd05', + fitzpatrick_scale: false, + category: "symbols" + }, + high_brightness: { + keywords: [ "sun", "light" ], + "char": '\ud83d\udd06', + fitzpatrick_scale: false, + category: "symbols" + }, + trident: { + keywords: [ "weapon", "spear" ], + "char": '\ud83d\udd31', + fitzpatrick_scale: false, + category: "symbols" + }, + fleur_de_lis: { + keywords: [ "decorative", "scout" ], + "char": '\u269c', + fitzpatrick_scale: false, + category: "symbols" + }, + part_alternation_mark: { + keywords: [ "graph", "presentation", "stats", "business", "economics", "bad" ], + "char": '\u303d\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + warning: { + keywords: [ "exclamation", "wip", "alert", "error", "problem", "issue" ], + "char": '\u26a0\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + children_crossing: { + keywords: [ "school", "warning", "danger", "sign", "driving", "yellow-diamond" ], + "char": '\ud83d\udeb8', + fitzpatrick_scale: false, + category: "symbols" + }, + beginner: { + keywords: [ "badge", "shield" ], + "char": '\ud83d\udd30', + fitzpatrick_scale: false, + category: "symbols" + }, + recycle: { + keywords: [ "arrow", "environment", "garbage", "trash" ], + "char": '\u267b\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + u6307: { + keywords: [ "chinese", "point", "green-square", "kanji" ], + "char": '\ud83c\ude2f', + fitzpatrick_scale: false, + category: "symbols" + }, + chart: { + keywords: [ "green-square", "graph", "presentation", "stats" ], + "char": '\ud83d\udcb9', + fitzpatrick_scale: false, + category: "symbols" + }, + sparkle: { + keywords: [ "stars", "green-square", "awesome", "good", "fireworks" ], + "char": '\u2747\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + eight_spoked_asterisk: { + keywords: [ "star", "sparkle", "green-square" ], + "char": '\u2733\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + negative_squared_cross_mark: { + keywords: [ "x", "green-square", "no", "deny" ], + "char": '\u274e', + fitzpatrick_scale: false, + category: "symbols" + }, + white_check_mark: { + keywords: [ "green-square", "ok", "agree", "vote", "election", "answer", "tick" ], + "char": '\u2705', + fitzpatrick_scale: false, + category: "symbols" + }, + diamond_shape_with_a_dot_inside: { + keywords: [ "jewel", "blue", "gem", "crystal", "fancy" ], + "char": '\ud83d\udca0', + fitzpatrick_scale: false, + category: "symbols" + }, + cyclone: { + keywords: [ "weather", "swirl", "blue", "cloud", "vortex", "spiral", "whirlpool", "spin", "tornado", "hurricane", "typhoon" ], + "char": '\ud83c\udf00', + fitzpatrick_scale: false, + category: "symbols" + }, + loop: { + keywords: [ "tape", "cassette" ], + "char": '\u27bf', + fitzpatrick_scale: false, + category: "symbols" + }, + globe_with_meridians: { + keywords: [ "earth", "international", "world", "internet", "interweb", "i18n" ], + "char": '\ud83c\udf10', + fitzpatrick_scale: false, + category: "symbols" + }, + m: { + keywords: [ "alphabet", "blue-circle", "letter" ], + "char": '\u24c2\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + atm: { + keywords: [ "money", "sales", "cash", "blue-square", "payment", "bank" ], + "char": '\ud83c\udfe7', + fitzpatrick_scale: false, + category: "symbols" + }, + sa: { + keywords: [ "japanese", "blue-square", "katakana" ], + "char": '\ud83c\ude02\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + passport_control: { + keywords: [ "custom", "blue-square" ], + "char": '\ud83d\udec2', + fitzpatrick_scale: false, + category: "symbols" + }, + customs: { + keywords: [ "passport", "border", "blue-square" ], + "char": '\ud83d\udec3', + fitzpatrick_scale: false, + category: "symbols" + }, + baggage_claim: { + keywords: [ "blue-square", "airport", "transport" ], + "char": '\ud83d\udec4', + fitzpatrick_scale: false, + category: "symbols" + }, + left_luggage: { + keywords: [ "blue-square", "travel" ], + "char": '\ud83d\udec5', + fitzpatrick_scale: false, + category: "symbols" + }, + wheelchair: { + keywords: [ "blue-square", "disabled", "a11y", "accessibility" ], + "char": '\u267f', + fitzpatrick_scale: false, + category: "symbols" + }, + no_smoking: { + keywords: [ "cigarette", "blue-square", "smell", "smoke" ], + "char": '\ud83d\udead', + fitzpatrick_scale: false, + category: "symbols" + }, + wc: { + keywords: [ "toilet", "restroom", "blue-square" ], + "char": '\ud83d\udebe', + fitzpatrick_scale: false, + category: "symbols" + }, + parking: { + keywords: [ "cars", "blue-square", "alphabet", "letter" ], + "char": '\ud83c\udd7f\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + potable_water: { + keywords: [ "blue-square", "liquid", "restroom", "cleaning", "faucet" ], + "char": '\ud83d\udeb0', + fitzpatrick_scale: false, + category: "symbols" + }, + mens: { + keywords: [ "toilet", "restroom", "wc", "blue-square", "gender", "male" ], + "char": '\ud83d\udeb9', + fitzpatrick_scale: false, + category: "symbols" + }, + womens: { + keywords: [ "purple-square", "woman", "female", "toilet", "loo", "restroom", "gender" ], + "char": '\ud83d\udeba', + fitzpatrick_scale: false, + category: "symbols" + }, + baby_symbol: { + keywords: [ "orange-square", "child" ], + "char": '\ud83d\udebc', + fitzpatrick_scale: false, + category: "symbols" + }, + restroom: { + keywords: [ "blue-square", "toilet", "refresh", "wc", "gender" ], + "char": '\ud83d\udebb', + fitzpatrick_scale: false, + category: "symbols" + }, + put_litter_in_its_place: { + keywords: [ "blue-square", "sign", "human", "info" ], + "char": '\ud83d\udeae', + fitzpatrick_scale: false, + category: "symbols" + }, + cinema: { + keywords: [ "blue-square", "record", "film", "movie", "curtain", "stage", "theater" ], + "char": '\ud83c\udfa6', + fitzpatrick_scale: false, + category: "symbols" + }, + signal_strength: { + keywords: [ "blue-square", "reception", "phone", "internet", "connection", "wifi", "bluetooth", "bars" ], + "char": '\ud83d\udcf6', + fitzpatrick_scale: false, + category: "symbols" + }, + koko: { + keywords: [ "blue-square", "here", "katakana", "japanese", "destination" ], + "char": '\ud83c\ude01', + fitzpatrick_scale: false, + category: "symbols" + }, + ng: { + keywords: [ "blue-square", "words", "shape", "icon" ], + "char": '\ud83c\udd96', + fitzpatrick_scale: false, + category: "symbols" + }, + ok: { + keywords: [ "good", "agree", "yes", "blue-square" ], + "char": '\ud83c\udd97', + fitzpatrick_scale: false, + category: "symbols" + }, + up: { + keywords: [ "blue-square", "above", "high" ], + "char": '\ud83c\udd99', + fitzpatrick_scale: false, + category: "symbols" + }, + cool: { + keywords: [ "words", "blue-square" ], + "char": '\ud83c\udd92', + fitzpatrick_scale: false, + category: "symbols" + }, + "new": { + keywords: [ "blue-square", "words", "start" ], + "char": '\ud83c\udd95', + fitzpatrick_scale: false, + category: "symbols" + }, + free: { + keywords: [ "blue-square", "words" ], + "char": '\ud83c\udd93', + fitzpatrick_scale: false, + category: "symbols" + }, + zero: { + keywords: [ "0", "numbers", "blue-square", "null" ], + "char": '0\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + one: { + keywords: [ "blue-square", "numbers", "1" ], + "char": '1\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + two: { + keywords: [ "numbers", "2", "prime", "blue-square" ], + "char": '2\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + three: { + keywords: [ "3", "numbers", "prime", "blue-square" ], + "char": '3\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + four: { + keywords: [ "4", "numbers", "blue-square" ], + "char": '4\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + five: { + keywords: [ "5", "numbers", "blue-square", "prime" ], + "char": '5\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + six: { + keywords: [ "6", "numbers", "blue-square" ], + "char": '6\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + seven: { + keywords: [ "7", "numbers", "blue-square", "prime" ], + "char": '7\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + eight: { + keywords: [ "8", "blue-square", "numbers" ], + "char": '8\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + nine: { + keywords: [ "blue-square", "numbers", "9" ], + "char": '9\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + keycap_ten: { + keywords: [ "numbers", "10", "blue-square" ], + "char": '\ud83d\udd1f', + fitzpatrick_scale: false, + category: "symbols" + }, + asterisk: { + keywords: [ "star", "keycap" ], + "char": '*\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + eject_button: { + keywords: [ "blue-square" ], + "char": '\u23cf\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_forward: { + keywords: [ "blue-square", "right", "direction", "play" ], + "char": '\u25b6\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + pause_button: { + keywords: [ "pause", "blue-square" ], + "char": '\u23f8', + fitzpatrick_scale: false, + category: "symbols" + }, + next_track_button: { + keywords: [ "forward", "next", "blue-square" ], + "char": '\u23ed', + fitzpatrick_scale: false, + category: "symbols" + }, + stop_button: { + keywords: [ "blue-square" ], + "char": '\u23f9', + fitzpatrick_scale: false, + category: "symbols" + }, + record_button: { + keywords: [ "blue-square" ], + "char": '\u23fa', + fitzpatrick_scale: false, + category: "symbols" + }, + play_or_pause_button: { + keywords: [ "blue-square", "play", "pause" ], + "char": '\u23ef', + fitzpatrick_scale: false, + category: "symbols" + }, + previous_track_button: { + keywords: [ "backward" ], + "char": '\u23ee', + fitzpatrick_scale: false, + category: "symbols" + }, + fast_forward: { + keywords: [ "blue-square", "play", "speed", "continue" ], + "char": '\u23e9', + fitzpatrick_scale: false, + category: "symbols" + }, + rewind: { + keywords: [ "play", "blue-square" ], + "char": '\u23ea', + fitzpatrick_scale: false, + category: "symbols" + }, + twisted_rightwards_arrows: { + keywords: [ "blue-square", "shuffle", "music", "random" ], + "char": '\ud83d\udd00', + fitzpatrick_scale: false, + category: "symbols" + }, + repeat: { + keywords: [ "loop", "record" ], + "char": '\ud83d\udd01', + fitzpatrick_scale: false, + category: "symbols" + }, + repeat_one: { + keywords: [ "blue-square", "loop" ], + "char": '\ud83d\udd02', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_backward: { + keywords: [ "blue-square", "left", "direction" ], + "char": '\u25c0\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up_small: { + keywords: [ "blue-square", "triangle", "direction", "point", "forward", "top" ], + "char": '\ud83d\udd3c', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_down_small: { + keywords: [ "blue-square", "direction", "bottom" ], + "char": '\ud83d\udd3d', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_double_up: { + keywords: [ "blue-square", "direction", "top" ], + "char": '\u23eb', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_double_down: { + keywords: [ "blue-square", "direction", "bottom" ], + "char": '\u23ec', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_right: { + keywords: [ "blue-square", "next" ], + "char": '\u27a1\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_left: { + keywords: [ "blue-square", "previous", "back" ], + "char": '\u2b05\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up: { + keywords: [ "blue-square", "continue", "top", "direction" ], + "char": '\u2b06\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_down: { + keywords: [ "blue-square", "direction", "bottom" ], + "char": '\u2b07\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_upper_right: { + keywords: [ "blue-square", "point", "direction", "diagonal", "northeast" ], + "char": '\u2197\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_lower_right: { + keywords: [ "blue-square", "direction", "diagonal", "southeast" ], + "char": '\u2198\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_lower_left: { + keywords: [ "blue-square", "direction", "diagonal", "southwest" ], + "char": '\u2199\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_upper_left: { + keywords: [ "blue-square", "point", "direction", "diagonal", "northwest" ], + "char": '\u2196\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up_down: { + keywords: [ "blue-square", "direction", "way", "vertical" ], + "char": '\u2195\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + left_right_arrow: { + keywords: [ "shape", "direction", "horizontal", "sideways" ], + "char": '\u2194\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrows_counterclockwise: { + keywords: [ "blue-square", "sync", "cycle" ], + "char": '\ud83d\udd04', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_right_hook: { + keywords: [ "blue-square", "return", "rotate", "direction" ], + "char": '\u21aa\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + leftwards_arrow_with_hook: { + keywords: [ "back", "return", "blue-square", "undo", "enter" ], + "char": '\u21a9\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_heading_up: { + keywords: [ "blue-square", "direction", "top" ], + "char": '\u2934\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_heading_down: { + keywords: [ "blue-square", "direction", "bottom" ], + "char": '\u2935\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + hash: { + keywords: [ "symbol", "blue-square", "twitter" ], + "char": '#\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + information_source: { + keywords: [ "blue-square", "alphabet", "letter" ], + "char": '\u2139\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + abc: { + keywords: [ "blue-square", "alphabet" ], + "char": '\ud83d\udd24', + fitzpatrick_scale: false, + category: "symbols" + }, + abcd: { + keywords: [ "blue-square", "alphabet" ], + "char": '\ud83d\udd21', + fitzpatrick_scale: false, + category: "symbols" + }, + capital_abcd: { + keywords: [ "alphabet", "words", "blue-square" ], + "char": '\ud83d\udd20', + fitzpatrick_scale: false, + category: "symbols" + }, + symbols: { + keywords: [ "blue-square", "music", "note", "ampersand", "percent", "glyphs", "characters" ], + "char": '\ud83d\udd23', + fitzpatrick_scale: false, + category: "symbols" + }, + musical_note: { + keywords: [ "score", "tone", "sound" ], + "char": '\ud83c\udfb5', + fitzpatrick_scale: false, + category: "symbols" + }, + notes: { + keywords: [ "music", "score" ], + "char": '\ud83c\udfb6', + fitzpatrick_scale: false, + category: "symbols" + }, + wavy_dash: { + keywords: [ "draw", "line", "moustache", "mustache", "squiggle", "scribble" ], + "char": '\u3030\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + curly_loop: { + keywords: [ "scribble", "draw", "shape", "squiggle" ], + "char": '\u27b0', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_check_mark: { + keywords: [ "ok", "nike", "answer", "yes", "tick" ], + "char": '\u2714\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrows_clockwise: { + keywords: [ "sync", "cycle", "round", "repeat" ], + "char": '\ud83d\udd03', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_plus_sign: { + keywords: [ "math", "calculation", "addition", "more", "increase" ], + "char": '\u2795', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_minus_sign: { + keywords: [ "math", "calculation", "subtract", "less" ], + "char": '\u2796', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_division_sign: { + keywords: [ "divide", "math", "calculation" ], + "char": '\u2797', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_multiplication_x: { + keywords: [ "math", "calculation" ], + "char": '\u2716\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + infinity: { + keywords: [ "forever" ], + "char": '\u267e', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_dollar_sign: { + keywords: [ "money", "sales", "payment", "currency", "buck" ], + "char": '\ud83d\udcb2', + fitzpatrick_scale: false, + category: "symbols" + }, + currency_exchange: { + keywords: [ "money", "sales", "dollar", "travel" ], + "char": '\ud83d\udcb1', + fitzpatrick_scale: false, + category: "symbols" + }, + copyright: { + keywords: [ "ip", "license", "circle", "law", "legal" ], + "char": '\xa9\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + registered: { + keywords: [ "alphabet", "circle" ], + "char": '\xae\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + tm: { + keywords: [ "trademark", "brand", "law", "legal" ], + "char": '\u2122\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + end: { + keywords: [ "words", "arrow" ], + "char": '\ud83d\udd1a', + fitzpatrick_scale: false, + category: "symbols" + }, + back: { + keywords: [ "arrow", "words", "return" ], + "char": '\ud83d\udd19', + fitzpatrick_scale: false, + category: "symbols" + }, + on: { + keywords: [ "arrow", "words" ], + "char": '\ud83d\udd1b', + fitzpatrick_scale: false, + category: "symbols" + }, + top: { + keywords: [ "words", "blue-square" ], + "char": '\ud83d\udd1d', + fitzpatrick_scale: false, + category: "symbols" + }, + soon: { + keywords: [ "arrow", "words" ], + "char": '\ud83d\udd1c', + fitzpatrick_scale: false, + category: "symbols" + }, + ballot_box_with_check: { + keywords: [ "ok", "agree", "confirm", "black-square", "vote", "election", "yes", "tick" ], + "char": '\u2611\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + radio_button: { + keywords: [ "input", "old", "music", "circle" ], + "char": '\ud83d\udd18', + fitzpatrick_scale: false, + category: "symbols" + }, + white_circle: { + keywords: [ "shape", "round" ], + "char": '\u26aa', + fitzpatrick_scale: false, + category: "symbols" + }, + black_circle: { + keywords: [ "shape", "button", "round" ], + "char": '\u26ab', + fitzpatrick_scale: false, + category: "symbols" + }, + red_circle: { + keywords: [ "shape", "error", "danger" ], + "char": '\ud83d\udd34', + fitzpatrick_scale: false, + category: "symbols" + }, + large_blue_circle: { + keywords: [ "shape", "icon", "button" ], + "char": '\ud83d\udd35', + fitzpatrick_scale: false, + category: "symbols" + }, + small_orange_diamond: { + keywords: [ "shape", "jewel", "gem" ], + "char": '\ud83d\udd38', + fitzpatrick_scale: false, + category: "symbols" + }, + small_blue_diamond: { + keywords: [ "shape", "jewel", "gem" ], + "char": '\ud83d\udd39', + fitzpatrick_scale: false, + category: "symbols" + }, + large_orange_diamond: { + keywords: [ "shape", "jewel", "gem" ], + "char": '\ud83d\udd36', + fitzpatrick_scale: false, + category: "symbols" + }, + large_blue_diamond: { + keywords: [ "shape", "jewel", "gem" ], + "char": '\ud83d\udd37', + fitzpatrick_scale: false, + category: "symbols" + }, + small_red_triangle: { + keywords: [ "shape", "direction", "up", "top" ], + "char": '\ud83d\udd3a', + fitzpatrick_scale: false, + category: "symbols" + }, + black_small_square: { + keywords: [ "shape", "icon" ], + "char": '\u25aa\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + white_small_square: { + keywords: [ "shape", "icon" ], + "char": '\u25ab\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + black_large_square: { + keywords: [ "shape", "icon", "button" ], + "char": '\u2b1b', + fitzpatrick_scale: false, + category: "symbols" + }, + white_large_square: { + keywords: [ "shape", "icon", "stone", "button" ], + "char": '\u2b1c', + fitzpatrick_scale: false, + category: "symbols" + }, + small_red_triangle_down: { + keywords: [ "shape", "direction", "bottom" ], + "char": '\ud83d\udd3b', + fitzpatrick_scale: false, + category: "symbols" + }, + black_medium_square: { + keywords: [ "shape", "button", "icon" ], + "char": '\u25fc\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + white_medium_square: { + keywords: [ "shape", "stone", "icon" ], + "char": '\u25fb\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + black_medium_small_square: { + keywords: [ "icon", "shape", "button" ], + "char": '\u25fe', + fitzpatrick_scale: false, + category: "symbols" + }, + white_medium_small_square: { + keywords: [ "shape", "stone", "icon", "button" ], + "char": '\u25fd', + fitzpatrick_scale: false, + category: "symbols" + }, + black_square_button: { + keywords: [ "shape", "input", "frame" ], + "char": '\ud83d\udd32', + fitzpatrick_scale: false, + category: "symbols" + }, + white_square_button: { + keywords: [ "shape", "input" ], + "char": '\ud83d\udd33', + fitzpatrick_scale: false, + category: "symbols" + }, + speaker: { + keywords: [ "sound", "volume", "silence", "broadcast" ], + "char": '\ud83d\udd08', + fitzpatrick_scale: false, + category: "symbols" + }, + sound: { + keywords: [ "volume", "speaker", "broadcast" ], + "char": '\ud83d\udd09', + fitzpatrick_scale: false, + category: "symbols" + }, + loud_sound: { + keywords: [ "volume", "noise", "noisy", "speaker", "broadcast" ], + "char": '\ud83d\udd0a', + fitzpatrick_scale: false, + category: "symbols" + }, + mute: { + keywords: [ "sound", "volume", "silence", "quiet" ], + "char": '\ud83d\udd07', + fitzpatrick_scale: false, + category: "symbols" + }, + mega: { + keywords: [ "sound", "speaker", "volume" ], + "char": '\ud83d\udce3', + fitzpatrick_scale: false, + category: "symbols" + }, + loudspeaker: { + keywords: [ "volume", "sound" ], + "char": '\ud83d\udce2', + fitzpatrick_scale: false, + category: "symbols" + }, + bell: { + keywords: [ "sound", "notification", "christmas", "xmas", "chime" ], + "char": '\ud83d\udd14', + fitzpatrick_scale: false, + category: "symbols" + }, + no_bell: { + keywords: [ "sound", "volume", "mute", "quiet", "silent" ], + "char": '\ud83d\udd15', + fitzpatrick_scale: false, + category: "symbols" + }, + black_joker: { + keywords: [ "poker", "cards", "game", "play", "magic" ], + "char": '\ud83c\udccf', + fitzpatrick_scale: false, + category: "symbols" + }, + mahjong: { + keywords: [ "game", "play", "chinese", "kanji" ], + "char": '\ud83c\udc04', + fitzpatrick_scale: false, + category: "symbols" + }, + spades: { + keywords: [ "poker", "cards", "suits", "magic" ], + "char": '\u2660\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + clubs: { + keywords: [ "poker", "cards", "magic", "suits" ], + "char": '\u2663\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + hearts: { + keywords: [ "poker", "cards", "magic", "suits" ], + "char": '\u2665\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + diamonds: { + keywords: [ "poker", "cards", "magic", "suits" ], + "char": '\u2666\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + flower_playing_cards: { + keywords: [ "game", "sunset", "red" ], + "char": '\ud83c\udfb4', + fitzpatrick_scale: false, + category: "symbols" + }, + thought_balloon: { + keywords: [ "bubble", "cloud", "speech", "thinking", "dream" ], + "char": '\ud83d\udcad', + fitzpatrick_scale: false, + category: "symbols" + }, + right_anger_bubble: { + keywords: [ "caption", "speech", "thinking", "mad" ], + "char": '\ud83d\uddef', + fitzpatrick_scale: false, + category: "symbols" + }, + speech_balloon: { + keywords: [ "bubble", "words", "message", "talk", "chatting" ], + "char": '\ud83d\udcac', + fitzpatrick_scale: false, + category: "symbols" + }, + left_speech_bubble: { + keywords: [ "words", "message", "talk", "chatting" ], + "char": '\ud83d\udde8', + fitzpatrick_scale: false, + category: "symbols" + }, + clock1: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd50', + fitzpatrick_scale: false, + category: "symbols" + }, + clock2: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd51', + fitzpatrick_scale: false, + category: "symbols" + }, + clock3: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd52', + fitzpatrick_scale: false, + category: "symbols" + }, + clock4: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd53', + fitzpatrick_scale: false, + category: "symbols" + }, + clock5: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd54', + fitzpatrick_scale: false, + category: "symbols" + }, + clock6: { + keywords: [ "time", "late", "early", "schedule", "dawn", "dusk" ], + "char": '\ud83d\udd55', + fitzpatrick_scale: false, + category: "symbols" + }, + clock7: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd56', + fitzpatrick_scale: false, + category: "symbols" + }, + clock8: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd57', + fitzpatrick_scale: false, + category: "symbols" + }, + clock9: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd58', + fitzpatrick_scale: false, + category: "symbols" + }, + clock10: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd59', + fitzpatrick_scale: false, + category: "symbols" + }, + clock11: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd5a', + fitzpatrick_scale: false, + category: "symbols" + }, + clock12: { + keywords: [ "time", "noon", "midnight", "midday", "late", "early", "schedule" ], + "char": '\ud83d\udd5b', + fitzpatrick_scale: false, + category: "symbols" + }, + clock130: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd5c', + fitzpatrick_scale: false, + category: "symbols" + }, + clock230: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd5d', + fitzpatrick_scale: false, + category: "symbols" + }, + clock330: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd5e', + fitzpatrick_scale: false, + category: "symbols" + }, + clock430: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd5f', + fitzpatrick_scale: false, + category: "symbols" + }, + clock530: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd60', + fitzpatrick_scale: false, + category: "symbols" + }, + clock630: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd61', + fitzpatrick_scale: false, + category: "symbols" + }, + clock730: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd62', + fitzpatrick_scale: false, + category: "symbols" + }, + clock830: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd63', + fitzpatrick_scale: false, + category: "symbols" + }, + clock930: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd64', + fitzpatrick_scale: false, + category: "symbols" + }, + clock1030: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd65', + fitzpatrick_scale: false, + category: "symbols" + }, + clock1130: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd66', + fitzpatrick_scale: false, + category: "symbols" + }, + clock1230: { + keywords: [ "time", "late", "early", "schedule" ], + "char": '\ud83d\udd67', + fitzpatrick_scale: false, + category: "symbols" + }, + afghanistan: { + keywords: [ "af", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + aland_islands: { + keywords: [ "\xc5land", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddfd', + fitzpatrick_scale: false, + category: "flags" + }, + albania: { + keywords: [ "al", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + algeria: { + keywords: [ "dz", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde9\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + american_samoa: { + keywords: [ "american", "ws", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + andorra: { + keywords: [ "ad", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + angola: { + keywords: [ "ao", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + anguilla: { + keywords: [ "ai", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + antarctica: { + keywords: [ "aq", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddf6', + fitzpatrick_scale: false, + category: "flags" + }, + antigua_barbuda: { + keywords: [ "antigua", "barbuda", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + argentina: { + keywords: [ "ar", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + armenia: { + keywords: [ "am", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + aruba: { + keywords: [ "aw", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + australia: { + keywords: [ "au", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + austria: { + keywords: [ "at", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + azerbaijan: { + keywords: [ "az", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + bahamas: { + keywords: [ "bs", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + bahrain: { + keywords: [ "bh", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + bangladesh: { + keywords: [ "bd", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + barbados: { + keywords: [ "bb", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\udde7', + fitzpatrick_scale: false, + category: "flags" + }, + belarus: { + keywords: [ "by", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + belgium: { + keywords: [ "be", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + belize: { + keywords: [ "bz", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + benin: { + keywords: [ "bj", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddef', + fitzpatrick_scale: false, + category: "flags" + }, + bermuda: { + keywords: [ "bm", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + bhutan: { + keywords: [ "bt", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + bolivia: { + keywords: [ "bo", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + caribbean_netherlands: { + keywords: [ "bonaire", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddf6', + fitzpatrick_scale: false, + category: "flags" + }, + bosnia_herzegovina: { + keywords: [ "bosnia", "herzegovina", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + botswana: { + keywords: [ "bw", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + brazil: { + keywords: [ "br", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + british_indian_ocean_territory: { + keywords: [ "british", "indian", "ocean", "territory", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + british_virgin_islands: { + keywords: [ "british", "virgin", "islands", "bvi", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfb\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + brunei: { + keywords: [ "bn", "darussalam", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + bulgaria: { + keywords: [ "bg", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + burkina_faso: { + keywords: [ "burkina", "faso", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + burundi: { + keywords: [ "bi", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + cape_verde: { + keywords: [ "cabo", "verde", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddfb', + fitzpatrick_scale: false, + category: "flags" + }, + cambodia: { + keywords: [ "kh", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + cameroon: { + keywords: [ "cm", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + canada: { + keywords: [ "ca", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + canary_islands: { + keywords: [ "canary", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + cayman_islands: { + keywords: [ "cayman", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + central_african_republic: { + keywords: [ "central", "african", "republic", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + chad: { + keywords: [ "td", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + chile: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + cn: { + keywords: [ "china", "chinese", "prc", "flag", "country", "nation", "banner" ], + "char": '\ud83c\udde8\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + christmas_island: { + keywords: [ "christmas", "island", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddfd', + fitzpatrick_scale: false, + category: "flags" + }, + cocos_islands: { + keywords: [ "cocos", "keeling", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + colombia: { + keywords: [ "co", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + comoros: { + keywords: [ "km", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + congo_brazzaville: { + keywords: [ "congo", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + congo_kinshasa: { + keywords: [ "congo", "democratic", "republic", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + cook_islands: { + keywords: [ "cook", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + costa_rica: { + keywords: [ "costa", "rica", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + croatia: { + keywords: [ "hr", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udded\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + cuba: { + keywords: [ "cu", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + curacao: { + keywords: [ "cura\xe7ao", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + cyprus: { + keywords: [ "cy", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + czech_republic: { + keywords: [ "cz", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + denmark: { + keywords: [ "dk", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde9\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + djibouti: { + keywords: [ "dj", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde9\ud83c\uddef', + fitzpatrick_scale: false, + category: "flags" + }, + dominica: { + keywords: [ "dm", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde9\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + dominican_republic: { + keywords: [ "dominican", "republic", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde9\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + ecuador: { + keywords: [ "ec", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddea\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + egypt: { + keywords: [ "eg", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddea\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + el_salvador: { + keywords: [ "el", "salvador", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddfb', + fitzpatrick_scale: false, + category: "flags" + }, + equatorial_guinea: { + keywords: [ "equatorial", "gn", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddf6', + fitzpatrick_scale: false, + category: "flags" + }, + eritrea: { + keywords: [ "er", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddea\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + estonia: { + keywords: [ "ee", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddea\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + ethiopia: { + keywords: [ "et", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddea\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + eu: { + keywords: [ "european", "union", "flag", "banner" ], + "char": '\ud83c\uddea\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + falkland_islands: { + keywords: [ "falkland", "islands", "malvinas", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddeb\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + faroe_islands: { + keywords: [ "faroe", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddeb\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + fiji: { + keywords: [ "fj", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddeb\ud83c\uddef', + fitzpatrick_scale: false, + category: "flags" + }, + finland: { + keywords: [ "fi", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddeb\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + fr: { + keywords: [ "banner", "flag", "nation", "france", "french", "country" ], + "char": '\ud83c\uddeb\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + french_guiana: { + keywords: [ "french", "guiana", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + french_polynesia: { + keywords: [ "french", "polynesia", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + french_southern_territories: { + keywords: [ "french", "southern", "territories", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + gabon: { + keywords: [ "ga", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + gambia: { + keywords: [ "gm", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + georgia: { + keywords: [ "ge", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + de: { + keywords: [ "german", "nation", "flag", "country", "banner" ], + "char": '\ud83c\udde9\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + ghana: { + keywords: [ "gh", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + gibraltar: { + keywords: [ "gi", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + greece: { + keywords: [ "gr", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + greenland: { + keywords: [ "gl", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + grenada: { + keywords: [ "gd", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + guadeloupe: { + keywords: [ "gp", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddf5', + fitzpatrick_scale: false, + category: "flags" + }, + guam: { + keywords: [ "gu", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + guatemala: { + keywords: [ "gt", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + guernsey: { + keywords: [ "gg", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + guinea: { + keywords: [ "gn", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + guinea_bissau: { + keywords: [ "gw", "bissau", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + guyana: { + keywords: [ "gy", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + haiti: { + keywords: [ "ht", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udded\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + honduras: { + keywords: [ "hn", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udded\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + hong_kong: { + keywords: [ "hong", "kong", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udded\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + hungary: { + keywords: [ "hu", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udded\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + iceland: { + keywords: [ "is", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + india: { + keywords: [ "in", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + indonesia: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + iran: { + keywords: [ "iran,", "islamic", "republic", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + iraq: { + keywords: [ "iq", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\uddf6', + fitzpatrick_scale: false, + category: "flags" + }, + ireland: { + keywords: [ "ie", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + isle_of_man: { + keywords: [ "isle", "man", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + israel: { + keywords: [ "il", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + it: { + keywords: [ "italy", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddee\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + cote_divoire: { + keywords: [ "ivory", "coast", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + jamaica: { + keywords: [ "jm", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddef\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + jp: { + keywords: [ "japanese", "nation", "flag", "country", "banner" ], + "char": '\ud83c\uddef\ud83c\uddf5', + fitzpatrick_scale: false, + category: "flags" + }, + jersey: { + keywords: [ "je", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddef\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + jordan: { + keywords: [ "jo", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddef\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + kazakhstan: { + keywords: [ "kz", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + kenya: { + keywords: [ "ke", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + kiribati: { + keywords: [ "ki", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + kosovo: { + keywords: [ "xk", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfd\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + kuwait: { + keywords: [ "kw", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + kyrgyzstan: { + keywords: [ "kg", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + laos: { + keywords: [ "lao", "democratic", "republic", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + latvia: { + keywords: [ "lv", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\uddfb', + fitzpatrick_scale: false, + category: "flags" + }, + lebanon: { + keywords: [ "lb", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\udde7', + fitzpatrick_scale: false, + category: "flags" + }, + lesotho: { + keywords: [ "ls", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + liberia: { + keywords: [ "lr", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + libya: { + keywords: [ "ly", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + liechtenstein: { + keywords: [ "li", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + lithuania: { + keywords: [ "lt", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + luxembourg: { + keywords: [ "lu", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + macau: { + keywords: [ "macao", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + macedonia: { + keywords: [ "macedonia,", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + madagascar: { + keywords: [ "mg", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + malawi: { + keywords: [ "mw", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + malaysia: { + keywords: [ "my", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + maldives: { + keywords: [ "mv", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddfb', + fitzpatrick_scale: false, + category: "flags" + }, + mali: { + keywords: [ "ml", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + malta: { + keywords: [ "mt", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + marshall_islands: { + keywords: [ "marshall", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + martinique: { + keywords: [ "mq", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddf6', + fitzpatrick_scale: false, + category: "flags" + }, + mauritania: { + keywords: [ "mr", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + mauritius: { + keywords: [ "mu", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + mayotte: { + keywords: [ "yt", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfe\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + mexico: { + keywords: [ "mx", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddfd', + fitzpatrick_scale: false, + category: "flags" + }, + micronesia: { + keywords: [ "micronesia,", "federated", "states", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddeb\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + moldova: { + keywords: [ "moldova,", "republic", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + monaco: { + keywords: [ "mc", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + mongolia: { + keywords: [ "mn", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + montenegro: { + keywords: [ "me", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + montserrat: { + keywords: [ "ms", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + morocco: { + keywords: [ "ma", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + mozambique: { + keywords: [ "mz", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + myanmar: { + keywords: [ "mm", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + namibia: { + keywords: [ "na", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + nauru: { + keywords: [ "nr", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + nepal: { + keywords: [ "np", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\uddf5', + fitzpatrick_scale: false, + category: "flags" + }, + netherlands: { + keywords: [ "nl", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + new_caledonia: { + keywords: [ "new", "caledonia", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + new_zealand: { + keywords: [ "new", "zealand", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + nicaragua: { + keywords: [ "ni", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + niger: { + keywords: [ "ne", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + nigeria: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + niue: { + keywords: [ "nu", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + norfolk_island: { + keywords: [ "norfolk", "island", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + northern_mariana_islands: { + keywords: [ "northern", "mariana", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf2\ud83c\uddf5', + fitzpatrick_scale: false, + category: "flags" + }, + north_korea: { + keywords: [ "north", "korea", "nation", "flag", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\uddf5', + fitzpatrick_scale: false, + category: "flags" + }, + norway: { + keywords: [ "no", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf3\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + oman: { + keywords: [ "om_symbol", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf4\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + pakistan: { + keywords: [ "pk", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + palau: { + keywords: [ "pw", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + palestinian_territories: { + keywords: [ "palestine", "palestinian", "territories", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + panama: { + keywords: [ "pa", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + papua_new_guinea: { + keywords: [ "papua", "new", "guinea", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + paraguay: { + keywords: [ "py", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + peru: { + keywords: [ "pe", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + philippines: { + keywords: [ "ph", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + pitcairn_islands: { + keywords: [ "pitcairn", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + poland: { + keywords: [ "pl", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + portugal: { + keywords: [ "pt", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + puerto_rico: { + keywords: [ "puerto", "rico", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + qatar: { + keywords: [ "qa", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf6\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + reunion: { + keywords: [ "r\xe9union", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf7\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + romania: { + keywords: [ "ro", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf7\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + ru: { + keywords: [ "russian", "federation", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf7\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + rwanda: { + keywords: [ "rw", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf7\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + st_barthelemy: { + keywords: [ "saint", "barth\xe9lemy", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde7\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + st_helena: { + keywords: [ "saint", "helena", "ascension", "tristan", "cunha", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + st_kitts_nevis: { + keywords: [ "saint", "kitts", "nevis", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + st_lucia: { + keywords: [ "saint", "lucia", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + st_pierre_miquelon: { + keywords: [ "saint", "pierre", "miquelon", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf5\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + st_vincent_grenadines: { + keywords: [ "saint", "vincent", "grenadines", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfb\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + samoa: { + keywords: [ "ws", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfc\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + san_marino: { + keywords: [ "san", "marino", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + sao_tome_principe: { + keywords: [ "sao", "tome", "principe", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + saudi_arabia: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + senegal: { + keywords: [ "sn", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + serbia: { + keywords: [ "rs", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf7\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + seychelles: { + keywords: [ "sc", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + sierra_leone: { + keywords: [ "sierra", "leone", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + singapore: { + keywords: [ "sg", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + sint_maarten: { + keywords: [ "sint", "maarten", "dutch", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddfd', + fitzpatrick_scale: false, + category: "flags" + }, + slovakia: { + keywords: [ "sk", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + slovenia: { + keywords: [ "si", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + solomon_islands: { + keywords: [ "solomon", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\udde7', + fitzpatrick_scale: false, + category: "flags" + }, + somalia: { + keywords: [ "so", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + south_africa: { + keywords: [ "south", "africa", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddff\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + south_georgia_south_sandwich_islands: { + keywords: [ "south", "georgia", "sandwich", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddec\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + kr: { + keywords: [ "south", "korea", "nation", "flag", "country", "banner" ], + "char": '\ud83c\uddf0\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + south_sudan: { + keywords: [ "south", "sd", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + es: { + keywords: [ "spain", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddea\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + sri_lanka: { + keywords: [ "sri", "lanka", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf1\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + sudan: { + keywords: [ "sd", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + suriname: { + keywords: [ "sr", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + swaziland: { + keywords: [ "sz", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + sweden: { + keywords: [ "se", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + switzerland: { + keywords: [ "ch", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde8\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + syria: { + keywords: [ "syrian", "arab", "republic", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf8\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + taiwan: { + keywords: [ "tw", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + tajikistan: { + keywords: [ "tj", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddef', + fitzpatrick_scale: false, + category: "flags" + }, + tanzania: { + keywords: [ "tanzania,", "united", "republic", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + thailand: { + keywords: [ "th", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + timor_leste: { + keywords: [ "timor", "leste", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + togo: { + keywords: [ "tg", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + tokelau: { + keywords: [ "tk", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + tonga: { + keywords: [ "to", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + trinidad_tobago: { + keywords: [ "trinidad", "tobago", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + tunisia: { + keywords: [ "tn", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + tr: { + keywords: [ "turkey", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + turkmenistan: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + turks_caicos_islands: { + keywords: [ "turks", "caicos", "islands", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + tuvalu: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddf9\ud83c\uddfb', + fitzpatrick_scale: false, + category: "flags" + }, + uganda: { + keywords: [ "ug", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfa\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + ukraine: { + keywords: [ "ua", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfa\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + united_arab_emirates: { + keywords: [ "united", "arab", "emirates", "flag", "nation", "country", "banner" ], + "char": '\ud83c\udde6\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + uk: { + keywords: [ "united", "kingdom", "great", "britain", "northern", "ireland", "flag", "nation", "country", "banner", "british", "UK", "english", "england", "union jack" ], + "char": '\ud83c\uddec\ud83c\udde7', + fitzpatrick_scale: false, + category: "flags" + }, + england: { + keywords: [ "flag", "english" ], + "char": '\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f', + fitzpatrick_scale: false, + category: "flags" + }, + scotland: { + keywords: [ "flag", "scottish" ], + "char": '\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f', + fitzpatrick_scale: false, + category: "flags" + }, + wales: { + keywords: [ "flag", "welsh" ], + "char": '\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f', + fitzpatrick_scale: false, + category: "flags" + }, + us: { + keywords: [ "united", "states", "america", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfa\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + us_virgin_islands: { + keywords: [ "virgin", "islands", "us", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfb\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + uruguay: { + keywords: [ "uy", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfa\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + uzbekistan: { + keywords: [ "uz", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfa\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + vanuatu: { + keywords: [ "vu", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfb\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + vatican_city: { + keywords: [ "vatican", "city", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfb\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + venezuela: { + keywords: [ "ve", "bolivarian", "republic", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfb\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + vietnam: { + keywords: [ "viet", "nam", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfb\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + wallis_futuna: { + keywords: [ "wallis", "futuna", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfc\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + western_sahara: { + keywords: [ "western", "sahara", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddea\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + yemen: { + keywords: [ "ye", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddfe\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + zambia: { + keywords: [ "zm", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddff\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + zimbabwe: { + keywords: [ "zw", "flag", "nation", "country", "banner" ], + "char": '\ud83c\uddff\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + united_nations: { + keywords: [ "un", "flag", "banner" ], + "char": '\ud83c\uddfa\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + pirate_flag: { + keywords: [ "skull", "crossbones", "flag", "banner" ], + "char": '\ud83c\udff4\u200d\u2620\ufe0f', + fitzpatrick_scale: false, + category: "flags" + } +}); \ No newline at end of file diff --git a/src/assets/tinymce/plugins/emoticons/js/emojiimages.min.js b/src/assets/tinymce/plugins/emoticons/js/emojiimages.min.js new file mode 100644 index 00000000..1bc8d72d --- /dev/null +++ b/src/assets/tinymce/plugins/emoticons/js/emojiimages.min.js @@ -0,0 +1,3 @@ +// Source: npm package: emojilib +// Images provided by twemoji: https://github.com/twitter/twemoji +window.tinymce.Resource.add("tinymce.plugins.emoticons",{100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],"char":'\ud83d\udcaf',fitzpatrick_scale:!1,category:"symbols"},1234:{keywords:["numbers","blue-square"],"char":'\ud83d\udd22',fitzpatrick_scale:!1,category:"symbols"},grinning:{keywords:["face","smile","happy","joy",":D","grin"],"char":'\ud83d\ude00',fitzpatrick_scale:!1,category:"people"},grimacing:{keywords:["face","grimace","teeth"],"char":'\ud83d\ude2c',fitzpatrick_scale:!1,category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],"char":'\ud83d\ude01',fitzpatrick_scale:!1,category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],"char":'\ud83d\ude02',fitzpatrick_scale:!1,category:"people"},rofl:{keywords:["face","rolling","floor","laughing","lol","haha"],"char":'\ud83e\udd23',fitzpatrick_scale:!1,category:"people"},partying:{keywords:["face","celebration","woohoo"],"char":'\ud83e\udd73',fitzpatrick_scale:!1,category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],"char":'\ud83d\ude03',fitzpatrick_scale:!1,category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],"char":'\ud83d\ude04',fitzpatrick_scale:!1,category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],"char":'\ud83d\ude05',fitzpatrick_scale:!1,category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],"char":'\ud83d\ude06',fitzpatrick_scale:!1,category:"people"},innocent:{keywords:["face","angel","heaven","halo"],"char":'\ud83d\ude07',fitzpatrick_scale:!1,category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile","eye"],"char":'\ud83d\ude09',fitzpatrick_scale:!1,category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],"char":'\ud83d\ude0a',fitzpatrick_scale:!1,category:"people"},slightly_smiling_face:{keywords:["face","smile"],"char":'\ud83d\ude42',fitzpatrick_scale:!1,category:"people"},upside_down_face:{keywords:["face","flipped","silly","smile"],"char":'\ud83d\ude43',fitzpatrick_scale:!1,category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],"char":'\u263a\ufe0f',fitzpatrick_scale:!1,category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"],"char":'\ud83d\ude0b',fitzpatrick_scale:!1,category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],"char":'\ud83d\ude0c',fitzpatrick_scale:!1,category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],"char":'\ud83d\ude0d',fitzpatrick_scale:!1,category:"people"},smiling_face_with_three_hearts:{keywords:["face","love","like","affection","valentines","infatuation","crush","hearts","adore"],"char":'\ud83e\udd70',fitzpatrick_scale:!1,category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],"char":'\ud83d\ude18',fitzpatrick_scale:!1,category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],"char":'\ud83d\ude17',fitzpatrick_scale:!1,category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],"char":'\ud83d\ude19',fitzpatrick_scale:!1,category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],"char":'\ud83d\ude1a',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],"char":'\ud83d\ude1c',fitzpatrick_scale:!1,category:"people"},zany:{keywords:["face","goofy","crazy"],"char":'\ud83e\udd2a',fitzpatrick_scale:!1,category:"people"},raised_eyebrow:{keywords:["face","distrust","scepticism","disapproval","disbelief","surprise"],"char":'\ud83e\udd28',fitzpatrick_scale:!1,category:"people"},monocle:{keywords:["face","stuffy","wealthy"],"char":'\ud83e\uddd0',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],"char":'\ud83d\ude1d',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],"char":'\ud83d\ude1b',fitzpatrick_scale:!1,category:"people"},money_mouth_face:{keywords:["face","rich","dollar","money"],"char":'\ud83e\udd11',fitzpatrick_scale:!1,category:"people"},nerd_face:{keywords:["face","nerdy","geek","dork"],"char":'\ud83e\udd13',fitzpatrick_scale:!1,category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],"char":'\ud83d\ude0e',fitzpatrick_scale:!1,category:"people"},star_struck:{keywords:["face","smile","starry","eyes","grinning"],"char":'\ud83e\udd29',fitzpatrick_scale:!1,category:"people"},clown_face:{keywords:["face"],"char":'\ud83e\udd21',fitzpatrick_scale:!1,category:"people"},cowboy_hat_face:{keywords:["face","cowgirl","hat"],"char":'\ud83e\udd20',fitzpatrick_scale:!1,category:"people"},hugs:{keywords:["face","smile","hug"],"char":'\ud83e\udd17',fitzpatrick_scale:!1,category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],"char":'\ud83d\ude0f',fitzpatrick_scale:!1,category:"people"},no_mouth:{keywords:["face","hellokitty"],"char":'\ud83d\ude36',fitzpatrick_scale:!1,category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],"char":'\ud83d\ude10',fitzpatrick_scale:!1,category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],"char":'\ud83d\ude11',fitzpatrick_scale:!1,category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"],"char":'\ud83d\ude12',fitzpatrick_scale:!1,category:"people"},roll_eyes:{keywords:["face","eyeroll","frustrated"],"char":'\ud83d\ude44',fitzpatrick_scale:!1,category:"people"},thinking:{keywords:["face","hmmm","think","consider"],"char":'\ud83e\udd14',fitzpatrick_scale:!1,category:"people"},lying_face:{keywords:["face","lie","pinocchio"],"char":'\ud83e\udd25',fitzpatrick_scale:!1,category:"people"},hand_over_mouth:{keywords:["face","whoops","shock","surprise"],"char":'\ud83e\udd2d',fitzpatrick_scale:!1,category:"people"},shushing:{keywords:["face","quiet","shhh"],"char":'\ud83e\udd2b',fitzpatrick_scale:!1,category:"people"},symbols_over_mouth:{keywords:["face","swearing","cursing","cussing","profanity","expletive"],"char":'\ud83e\udd2c',fitzpatrick_scale:!1,category:"people"},exploding_head:{keywords:["face","shocked","mind","blown"],"char":'\ud83e\udd2f',fitzpatrick_scale:!1,category:"people"},flushed:{keywords:["face","blush","shy","flattered"],"char":'\ud83d\ude33',fitzpatrick_scale:!1,category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],"char":'\ud83d\ude1e',fitzpatrick_scale:!1,category:"people"},worried:{keywords:["face","concern","nervous",":("],"char":'\ud83d\ude1f',fitzpatrick_scale:!1,category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],"char":'\ud83d\ude20',fitzpatrick_scale:!1,category:"people"},rage:{keywords:["angry","mad","hate","despise"],"char":'\ud83d\ude21',fitzpatrick_scale:!1,category:"people"},pensive:{keywords:["face","sad","depressed","upset"],"char":'\ud83d\ude14',fitzpatrick_scale:!1,category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],"char":'\ud83d\ude15',fitzpatrick_scale:!1,category:"people"},slightly_frowning_face:{keywords:["face","frowning","disappointed","sad","upset"],"char":'\ud83d\ude41',fitzpatrick_scale:!1,category:"people"},frowning_face:{keywords:["face","sad","upset","frown"],"char":'\u2639',fitzpatrick_scale:!1,category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],"char":'\ud83d\ude23',fitzpatrick_scale:!1,category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],"char":'\ud83d\ude16',fitzpatrick_scale:!1,category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],"char":'\ud83d\ude2b',fitzpatrick_scale:!1,category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],"char":'\ud83d\ude29',fitzpatrick_scale:!1,category:"people"},pleading:{keywords:["face","begging","mercy"],"char":'\ud83e\udd7a',fitzpatrick_scale:!1,category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],"char":'\ud83d\ude24',fitzpatrick_scale:!1,category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],"char":'\ud83d\ude2e',fitzpatrick_scale:!1,category:"people"},scream:{keywords:["face","munch","scared","omg"],"char":'\ud83d\ude31',fitzpatrick_scale:!1,category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],"char":'\ud83d\ude28',fitzpatrick_scale:!1,category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],"char":'\ud83d\ude30',fitzpatrick_scale:!1,category:"people"},hushed:{keywords:["face","woo","shh"],"char":'\ud83d\ude2f',fitzpatrick_scale:!1,category:"people"},frowning:{keywords:["face","aw","what"],"char":'\ud83d\ude26',fitzpatrick_scale:!1,category:"people"},anguished:{keywords:["face","stunned","nervous"],"char":'\ud83d\ude27',fitzpatrick_scale:!1,category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],"char":'\ud83d\ude22',fitzpatrick_scale:!1,category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],"char":'\ud83d\ude25',fitzpatrick_scale:!1,category:"people"},drooling_face:{keywords:["face"],"char":'\ud83e\udd24',fitzpatrick_scale:!1,category:"people"},sleepy:{keywords:["face","tired","rest","nap"],"char":'\ud83d\ude2a',fitzpatrick_scale:!1,category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],"char":'\ud83d\ude13',fitzpatrick_scale:!1,category:"people"},hot:{keywords:["face","feverish","heat","red","sweating"],"char":'\ud83e\udd75',fitzpatrick_scale:!1,category:"people"},cold:{keywords:["face","blue","freezing","frozen","frostbite","icicles"],"char":'\ud83e\udd76',fitzpatrick_scale:!1,category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],"char":'\ud83d\ude2d',fitzpatrick_scale:!1,category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],"char":'\ud83d\ude35',fitzpatrick_scale:!1,category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],"char":'\ud83d\ude32',fitzpatrick_scale:!1,category:"people"},zipper_mouth_face:{keywords:["face","sealed","zipper","secret"],"char":'\ud83e\udd10',fitzpatrick_scale:!1,category:"people"},nauseated_face:{keywords:["face","vomit","gross","green","sick","throw up","ill"],"char":'\ud83e\udd22',fitzpatrick_scale:!1,category:"people"},sneezing_face:{keywords:["face","gesundheit","sneeze","sick","allergy"],"char":'\ud83e\udd27',fitzpatrick_scale:!1,category:"people"},vomiting:{keywords:["face","sick"],"char":'\ud83e\udd2e',fitzpatrick_scale:!1,category:"people"},mask:{keywords:["face","sick","ill","disease"],"char":'\ud83d\ude37',fitzpatrick_scale:!1,category:"people"},face_with_thermometer:{keywords:["sick","temperature","thermometer","cold","fever"],"char":'\ud83e\udd12',fitzpatrick_scale:!1,category:"people"},face_with_head_bandage:{keywords:["injured","clumsy","bandage","hurt"],"char":'\ud83e\udd15',fitzpatrick_scale:!1,category:"people"},woozy:{keywords:["face","dizzy","intoxicated","tipsy","wavy"],"char":'\ud83e\udd74',fitzpatrick_scale:!1,category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],"char":'\ud83d\ude34',fitzpatrick_scale:!1,category:"people"},zzz:{keywords:["sleepy","tired","dream"],"char":'\ud83d\udca4',fitzpatrick_scale:!1,category:"people"},poop:{keywords:["hankey","shitface","fail","turd","shit"],"char":'\ud83d\udca9',fitzpatrick_scale:!1,category:"people"},smiling_imp:{keywords:["devil","horns"],"char":'\ud83d\ude08',fitzpatrick_scale:!1,category:"people"},imp:{keywords:["devil","angry","horns"],"char":'\ud83d\udc7f',fitzpatrick_scale:!1,category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],"char":'\ud83d\udc79',fitzpatrick_scale:!1,category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],"char":'\ud83d\udc7a',fitzpatrick_scale:!1,category:"people"},skull:{keywords:["dead","skeleton","creepy","death"],"char":'\ud83d\udc80',fitzpatrick_scale:!1,category:"people"},ghost:{keywords:["halloween","spooky","scary"],"char":'\ud83d\udc7b',fitzpatrick_scale:!1,category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],"char":'\ud83d\udc7d',fitzpatrick_scale:!1,category:"people"},robot:{keywords:["computer","machine","bot"],"char":'\ud83e\udd16',fitzpatrick_scale:!1,category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],"char":'\ud83d\ude3a',fitzpatrick_scale:!1,category:"people"},smile_cat:{keywords:["animal","cats","smile"],"char":'\ud83d\ude38',fitzpatrick_scale:!1,category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],"char":'\ud83d\ude39',fitzpatrick_scale:!1,category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],"char":'\ud83d\ude3b',fitzpatrick_scale:!1,category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],"char":'\ud83d\ude3c',fitzpatrick_scale:!1,category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],"char":'\ud83d\ude3d',fitzpatrick_scale:!1,category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],"char":'\ud83d\ude40',fitzpatrick_scale:!1,category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],"char":'\ud83d\ude3f',fitzpatrick_scale:!1,category:"people"},pouting_cat:{keywords:["animal","cats"],"char":'\ud83d\ude3e',fitzpatrick_scale:!1,category:"people"},palms_up:{keywords:["hands","gesture","cupped","prayer"],"char":'\ud83e\udd32',fitzpatrick_scale:!0,category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],"char":'\ud83d\ude4c',fitzpatrick_scale:!0,category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],"char":'\ud83d\udc4f',fitzpatrick_scale:!0,category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","hi","palm"],"char":'\ud83d\udc4b',fitzpatrick_scale:!0,category:"people"},call_me_hand:{keywords:["hands","gesture"],"char":'\ud83e\udd19',fitzpatrick_scale:!0,category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],"char":'\ud83d\udc4d',fitzpatrick_scale:!0,category:"people"},"-1":{keywords:["thumbsdown","no","dislike","hand"],"char":'\ud83d\udc4e',fitzpatrick_scale:!0,category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],"char":'\ud83d\udc4a',fitzpatrick_scale:!0,category:"people"},fist:{keywords:["fingers","hand","grasp"],"char":'\u270a',fitzpatrick_scale:!0,category:"people"},fist_left:{keywords:["hand","fistbump"],"char":'\ud83e\udd1b',fitzpatrick_scale:!0,category:"people"},fist_right:{keywords:["hand","fistbump"],"char":'\ud83e\udd1c',fitzpatrick_scale:!0,category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],"char":'\u270c',fitzpatrick_scale:!0,category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok","okay"],"char":'\ud83d\udc4c',fitzpatrick_scale:!0,category:"people"},raised_hand:{keywords:["fingers","stop","highfive","palm","ban"],"char":'\u270b',fitzpatrick_scale:!0,category:"people"},raised_back_of_hand:{keywords:["fingers","raised","backhand"],"char":'\ud83e\udd1a',fitzpatrick_scale:!0,category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],"char":'\ud83d\udc50',fitzpatrick_scale:!0,category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],"char":'\ud83d\udcaa',fitzpatrick_scale:!0,category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],"char":'\ud83d\ude4f',fitzpatrick_scale:!0,category:"people"},foot:{keywords:["kick","stomp"],"char":'\ud83e\uddb6',fitzpatrick_scale:!0,category:"people"},leg:{keywords:["kick","limb"],"char":'\ud83e\uddb5',fitzpatrick_scale:!0,category:"people"},handshake:{keywords:["agreement","shake"],"char":'\ud83e\udd1d',fitzpatrick_scale:!1,category:"people"},point_up:{keywords:["hand","fingers","direction","up"],"char":'\u261d',fitzpatrick_scale:!0,category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],"char":'\ud83d\udc46',fitzpatrick_scale:!0,category:"people"},point_down:{keywords:["fingers","hand","direction","down"],"char":'\ud83d\udc47',fitzpatrick_scale:!0,category:"people"},point_left:{keywords:["direction","fingers","hand","left"],"char":'\ud83d\udc48',fitzpatrick_scale:!0,category:"people"},point_right:{keywords:["fingers","hand","direction","right"],"char":'\ud83d\udc49',fitzpatrick_scale:!0,category:"people"},fu:{keywords:["hand","fingers","rude","middle","flipping"],"char":'\ud83d\udd95',fitzpatrick_scale:!0,category:"people"},raised_hand_with_fingers_splayed:{keywords:["hand","fingers","palm"],"char":'\ud83d\udd90',fitzpatrick_scale:!0,category:"people"},love_you:{keywords:["hand","fingers","gesture"],"char":'\ud83e\udd1f',fitzpatrick_scale:!0,category:"people"},metal:{keywords:["hand","fingers","evil_eye","sign_of_horns","rock_on"],"char":'\ud83e\udd18',fitzpatrick_scale:!0,category:"people"},crossed_fingers:{keywords:["good","lucky"],"char":'\ud83e\udd1e',fitzpatrick_scale:!0,category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],"char":'\ud83d\udd96',fitzpatrick_scale:!0,category:"people"},writing_hand:{keywords:["lower_left_ballpoint_pen","stationery","write","compose"],"char":'\u270d',fitzpatrick_scale:!0,category:"people"},selfie:{keywords:["camera","phone"],"char":'\ud83e\udd33',fitzpatrick_scale:!0,category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],"char":'\ud83d\udc85',fitzpatrick_scale:!0,category:"people"},lips:{keywords:["mouth","kiss"],"char":'\ud83d\udc44',fitzpatrick_scale:!1,category:"people"},tooth:{keywords:["teeth","dentist"],"char":'\ud83e\uddb7',fitzpatrick_scale:!1,category:"people"},tongue:{keywords:["mouth","playful"],"char":'\ud83d\udc45',fitzpatrick_scale:!1,category:"people"},ear:{keywords:["face","hear","sound","listen"],"char":'\ud83d\udc42',fitzpatrick_scale:!0,category:"people"},nose:{keywords:["smell","sniff"],"char":'\ud83d\udc43',fitzpatrick_scale:!0,category:"people"},eye:{keywords:["face","look","see","watch","stare"],"char":'\ud83d\udc41',fitzpatrick_scale:!1,category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],"char":'\ud83d\udc40',fitzpatrick_scale:!1,category:"people"},brain:{keywords:["smart","intelligent"],"char":'\ud83e\udde0',fitzpatrick_scale:!1,category:"people"},bust_in_silhouette:{keywords:["user","person","human"],"char":'\ud83d\udc64',fitzpatrick_scale:!1,category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],"char":'\ud83d\udc65',fitzpatrick_scale:!1,category:"people"},speaking_head:{keywords:["user","person","human","sing","say","talk"],"char":'\ud83d\udde3',fitzpatrick_scale:!1,category:"people"},baby:{keywords:["child","boy","girl","toddler"],"char":'\ud83d\udc76',fitzpatrick_scale:!0,category:"people"},child:{keywords:["gender-neutral","young"],"char":'\ud83e\uddd2',fitzpatrick_scale:!0,category:"people"},boy:{keywords:["man","male","guy","teenager"],"char":'\ud83d\udc66',fitzpatrick_scale:!0,category:"people"},girl:{keywords:["female","woman","teenager"],"char":'\ud83d\udc67',fitzpatrick_scale:!0,category:"people"},adult:{keywords:["gender-neutral","person"],"char":'\ud83e\uddd1',fitzpatrick_scale:!0,category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],"char":'\ud83d\udc68',fitzpatrick_scale:!0,category:"people"},woman:{keywords:["female","girls","lady"],"char":'\ud83d\udc69',fitzpatrick_scale:!0,category:"people"},blonde_woman:{keywords:["woman","female","girl","blonde","person"],"char":'\ud83d\udc71\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},blonde_man:{keywords:["man","male","boy","blonde","guy","person"],"char":'\ud83d\udc71',fitzpatrick_scale:!0,category:"people"},bearded_person:{keywords:["person","bewhiskered"],"char":'\ud83e\uddd4',fitzpatrick_scale:!0,category:"people"},older_adult:{keywords:["human","elder","senior","gender-neutral"],"char":'\ud83e\uddd3',fitzpatrick_scale:!0,category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],"char":'\ud83d\udc74',fitzpatrick_scale:!0,category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],"char":'\ud83d\udc75',fitzpatrick_scale:!0,category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],"char":'\ud83d\udc72',fitzpatrick_scale:!0,category:"people"},woman_with_headscarf:{keywords:["female","hijab","mantilla","tichel"],"char":'\ud83e\uddd5',fitzpatrick_scale:!0,category:"people"},woman_with_turban:{keywords:["female","indian","hinduism","arabs","woman"],"char":'\ud83d\udc73\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],"char":'\ud83d\udc73',fitzpatrick_scale:!0,category:"people"},policewoman:{keywords:["woman","police","law","legal","enforcement","arrest","911","female"],"char":'\ud83d\udc6e\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},policeman:{keywords:["man","police","law","legal","enforcement","arrest","911"],"char":'\ud83d\udc6e',fitzpatrick_scale:!0,category:"people"},construction_worker_woman:{keywords:["female","human","wip","build","construction","worker","labor","woman"],"char":'\ud83d\udc77\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},construction_worker_man:{keywords:["male","human","wip","guy","build","construction","worker","labor"],"char":'\ud83d\udc77',fitzpatrick_scale:!0,category:"people"},guardswoman:{keywords:["uk","gb","british","female","royal","woman"],"char":'\ud83d\udc82\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],"char":'\ud83d\udc82',fitzpatrick_scale:!0,category:"people"},female_detective:{keywords:["human","spy","detective","female","woman"],"char":'\ud83d\udd75\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},male_detective:{keywords:["human","spy","detective"],"char":'\ud83d\udd75',fitzpatrick_scale:!0,category:"people"},woman_health_worker:{keywords:["doctor","nurse","therapist","healthcare","woman","human"],"char":'\ud83d\udc69\u200d\u2695\ufe0f',fitzpatrick_scale:!0,category:"people"},man_health_worker:{keywords:["doctor","nurse","therapist","healthcare","man","human"],"char":'\ud83d\udc68\u200d\u2695\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_farmer:{keywords:["rancher","gardener","woman","human"],"char":'\ud83d\udc69\u200d\ud83c\udf3e',fitzpatrick_scale:!0,category:"people"},man_farmer:{keywords:["rancher","gardener","man","human"],"char":'\ud83d\udc68\u200d\ud83c\udf3e',fitzpatrick_scale:!0,category:"people"},woman_cook:{keywords:["chef","woman","human"],"char":'\ud83d\udc69\u200d\ud83c\udf73',fitzpatrick_scale:!0,category:"people"},man_cook:{keywords:["chef","man","human"],"char":'\ud83d\udc68\u200d\ud83c\udf73',fitzpatrick_scale:!0,category:"people"},woman_student:{keywords:["graduate","woman","human"],"char":'\ud83d\udc69\u200d\ud83c\udf93',fitzpatrick_scale:!0,category:"people"},man_student:{keywords:["graduate","man","human"],"char":'\ud83d\udc68\u200d\ud83c\udf93',fitzpatrick_scale:!0,category:"people"},woman_singer:{keywords:["rockstar","entertainer","woman","human"],"char":'\ud83d\udc69\u200d\ud83c\udfa4',fitzpatrick_scale:!0,category:"people"},man_singer:{keywords:["rockstar","entertainer","man","human"],"char":'\ud83d\udc68\u200d\ud83c\udfa4',fitzpatrick_scale:!0,category:"people"},woman_teacher:{keywords:["instructor","professor","woman","human"],"char":'\ud83d\udc69\u200d\ud83c\udfeb',fitzpatrick_scale:!0,category:"people"},man_teacher:{keywords:["instructor","professor","man","human"],"char":'\ud83d\udc68\u200d\ud83c\udfeb',fitzpatrick_scale:!0,category:"people"},woman_factory_worker:{keywords:["assembly","industrial","woman","human"],"char":'\ud83d\udc69\u200d\ud83c\udfed',fitzpatrick_scale:!0,category:"people"},man_factory_worker:{keywords:["assembly","industrial","man","human"],"char":'\ud83d\udc68\u200d\ud83c\udfed',fitzpatrick_scale:!0,category:"people"},woman_technologist:{keywords:["coder","developer","engineer","programmer","software","woman","human","laptop","computer"],"char":'\ud83d\udc69\u200d\ud83d\udcbb',fitzpatrick_scale:!0,category:"people"},man_technologist:{keywords:["coder","developer","engineer","programmer","software","man","human","laptop","computer"],"char":'\ud83d\udc68\u200d\ud83d\udcbb',fitzpatrick_scale:!0,category:"people"},woman_office_worker:{keywords:["business","manager","woman","human"],"char":'\ud83d\udc69\u200d\ud83d\udcbc',fitzpatrick_scale:!0,category:"people"},man_office_worker:{keywords:["business","manager","man","human"],"char":'\ud83d\udc68\u200d\ud83d\udcbc',fitzpatrick_scale:!0,category:"people"},woman_mechanic:{keywords:["plumber","woman","human","wrench"],"char":'\ud83d\udc69\u200d\ud83d\udd27',fitzpatrick_scale:!0,category:"people"},man_mechanic:{keywords:["plumber","man","human","wrench"],"char":'\ud83d\udc68\u200d\ud83d\udd27',fitzpatrick_scale:!0,category:"people"},woman_scientist:{keywords:["biologist","chemist","engineer","physicist","woman","human"],"char":'\ud83d\udc69\u200d\ud83d\udd2c',fitzpatrick_scale:!0,category:"people"},man_scientist:{keywords:["biologist","chemist","engineer","physicist","man","human"],"char":'\ud83d\udc68\u200d\ud83d\udd2c',fitzpatrick_scale:!0,category:"people"},woman_artist:{keywords:["painter","woman","human"],"char":'\ud83d\udc69\u200d\ud83c\udfa8',fitzpatrick_scale:!0,category:"people"},man_artist:{keywords:["painter","man","human"],"char":'\ud83d\udc68\u200d\ud83c\udfa8',fitzpatrick_scale:!0,category:"people"},woman_firefighter:{keywords:["fireman","woman","human"],"char":'\ud83d\udc69\u200d\ud83d\ude92',fitzpatrick_scale:!0,category:"people"},man_firefighter:{keywords:["fireman","man","human"],"char":'\ud83d\udc68\u200d\ud83d\ude92',fitzpatrick_scale:!0,category:"people"},woman_pilot:{keywords:["aviator","plane","woman","human"],"char":'\ud83d\udc69\u200d\u2708\ufe0f',fitzpatrick_scale:!0,category:"people"},man_pilot:{keywords:["aviator","plane","man","human"],"char":'\ud83d\udc68\u200d\u2708\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_astronaut:{keywords:["space","rocket","woman","human"],"char":'\ud83d\udc69\u200d\ud83d\ude80',fitzpatrick_scale:!0,category:"people"},man_astronaut:{keywords:["space","rocket","man","human"],"char":'\ud83d\udc68\u200d\ud83d\ude80',fitzpatrick_scale:!0,category:"people"},woman_judge:{keywords:["justice","court","woman","human"],"char":'\ud83d\udc69\u200d\u2696\ufe0f',fitzpatrick_scale:!0,category:"people"},man_judge:{keywords:["justice","court","man","human"],"char":'\ud83d\udc68\u200d\u2696\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_superhero:{keywords:["woman","female","good","heroine","superpowers"],"char":'\ud83e\uddb8\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_superhero:{keywords:["man","male","good","hero","superpowers"],"char":'\ud83e\uddb8\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_supervillain:{keywords:["woman","female","evil","bad","criminal","heroine","superpowers"],"char":'\ud83e\uddb9\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_supervillain:{keywords:["man","male","evil","bad","criminal","hero","superpowers"],"char":'\ud83e\uddb9\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},mrs_claus:{keywords:["woman","female","xmas","mother christmas"],"char":'\ud83e\udd36',fitzpatrick_scale:!0,category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],"char":'\ud83c\udf85',fitzpatrick_scale:!0,category:"people"},sorceress:{keywords:["woman","female","mage","witch"],"char":'\ud83e\uddd9\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},wizard:{keywords:["man","male","mage","sorcerer"],"char":'\ud83e\uddd9\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_elf:{keywords:["woman","female"],"char":'\ud83e\udddd\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_elf:{keywords:["man","male"],"char":'\ud83e\udddd\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_vampire:{keywords:["woman","female"],"char":'\ud83e\udddb\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_vampire:{keywords:["man","male","dracula"],"char":'\ud83e\udddb\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_zombie:{keywords:["woman","female","undead","walking dead"],"char":'\ud83e\udddf\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"people"},man_zombie:{keywords:["man","male","dracula","undead","walking dead"],"char":'\ud83e\udddf\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},woman_genie:{keywords:["woman","female"],"char":'\ud83e\uddde\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"people"},man_genie:{keywords:["man","male"],"char":'\ud83e\uddde\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},mermaid:{keywords:["woman","female","merwoman","ariel"],"char":'\ud83e\udddc\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},merman:{keywords:["man","male","triton"],"char":'\ud83e\udddc\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_fairy:{keywords:["woman","female"],"char":'\ud83e\uddda\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_fairy:{keywords:["man","male"],"char":'\ud83e\uddda\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},angel:{keywords:["heaven","wings","halo"],"char":'\ud83d\udc7c',fitzpatrick_scale:!0,category:"people"},pregnant_woman:{keywords:["baby"],"char":'\ud83e\udd30',fitzpatrick_scale:!0,category:"people"},breastfeeding:{keywords:["nursing","baby"],"char":'\ud83e\udd31',fitzpatrick_scale:!0,category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],"char":'\ud83d\udc78',fitzpatrick_scale:!0,category:"people"},prince:{keywords:["boy","man","male","crown","royal","king"],"char":'\ud83e\udd34',fitzpatrick_scale:!0,category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],"char":'\ud83d\udc70',fitzpatrick_scale:!0,category:"people"},man_in_tuxedo:{keywords:["couple","marriage","wedding","groom"],"char":'\ud83e\udd35',fitzpatrick_scale:!0,category:"people"},running_woman:{keywords:["woman","walking","exercise","race","running","female"],"char":'\ud83c\udfc3\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},running_man:{keywords:["man","walking","exercise","race","running"],"char":'\ud83c\udfc3',fitzpatrick_scale:!0,category:"people"},walking_woman:{keywords:["human","feet","steps","woman","female"],"char":'\ud83d\udeb6\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},walking_man:{keywords:["human","feet","steps"],"char":'\ud83d\udeb6',fitzpatrick_scale:!0,category:"people"},dancer:{keywords:["female","girl","woman","fun"],"char":'\ud83d\udc83',fitzpatrick_scale:!0,category:"people"},man_dancing:{keywords:["male","boy","fun","dancer"],"char":'\ud83d\udd7a',fitzpatrick_scale:!0,category:"people"},dancing_women:{keywords:["female","bunny","women","girls"],"char":'\ud83d\udc6f',fitzpatrick_scale:!1,category:"people"},dancing_men:{keywords:["male","bunny","men","boys"],"char":'\ud83d\udc6f\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],"char":'\ud83d\udc6b',fitzpatrick_scale:!1,category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],"char":'\ud83d\udc6c',fitzpatrick_scale:!1,category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],"char":'\ud83d\udc6d',fitzpatrick_scale:!1,category:"people"},bowing_woman:{keywords:["woman","female","girl"],"char":'\ud83d\ude47\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},bowing_man:{keywords:["man","male","boy"],"char":'\ud83d\ude47',fitzpatrick_scale:!0,category:"people"},man_facepalming:{keywords:["man","male","boy","disbelief"],"char":'\ud83e\udd26\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_facepalming:{keywords:["woman","female","girl","disbelief"],"char":'\ud83e\udd26\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_shrugging:{keywords:["woman","female","girl","confused","indifferent","doubt"],"char":'\ud83e\udd37',fitzpatrick_scale:!0,category:"people"},man_shrugging:{keywords:["man","male","boy","confused","indifferent","doubt"],"char":'\ud83e\udd37\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},tipping_hand_woman:{keywords:["female","girl","woman","human","information"],"char":'\ud83d\udc81',fitzpatrick_scale:!0,category:"people"},tipping_hand_man:{keywords:["male","boy","man","human","information"],"char":'\ud83d\udc81\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},no_good_woman:{keywords:["female","girl","woman","nope"],"char":'\ud83d\ude45',fitzpatrick_scale:!0,category:"people"},no_good_man:{keywords:["male","boy","man","nope"],"char":'\ud83d\ude45\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],"char":'\ud83d\ude46',fitzpatrick_scale:!0,category:"people"},ok_man:{keywords:["men","boy","male","blue","human","man"],"char":'\ud83d\ude46\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},raising_hand_woman:{keywords:["female","girl","woman"],"char":'\ud83d\ude4b',fitzpatrick_scale:!0,category:"people"},raising_hand_man:{keywords:["male","boy","man"],"char":'\ud83d\ude4b\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},pouting_woman:{keywords:["female","girl","woman"],"char":'\ud83d\ude4e',fitzpatrick_scale:!0,category:"people"},pouting_man:{keywords:["male","boy","man"],"char":'\ud83d\ude4e\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},frowning_woman:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],"char":'\ud83d\ude4d',fitzpatrick_scale:!0,category:"people"},frowning_man:{keywords:["male","boy","man","sad","depressed","discouraged","unhappy"],"char":'\ud83d\ude4d\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},haircut_woman:{keywords:["female","girl","woman"],"char":'\ud83d\udc87',fitzpatrick_scale:!0,category:"people"},haircut_man:{keywords:["male","boy","man"],"char":'\ud83d\udc87\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},massage_woman:{keywords:["female","girl","woman","head"],"char":'\ud83d\udc86',fitzpatrick_scale:!0,category:"people"},massage_man:{keywords:["male","boy","man","head"],"char":'\ud83d\udc86\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_in_steamy_room:{keywords:["female","woman","spa","steamroom","sauna"],"char":'\ud83e\uddd6\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_in_steamy_room:{keywords:["male","man","spa","steamroom","sauna"],"char":'\ud83e\uddd6\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},couple_with_heart_woman_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],"char":'\ud83d\udc91',fitzpatrick_scale:!1,category:"people"},couple_with_heart_woman_woman:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],"char":'\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69',fitzpatrick_scale:!1,category:"people"},couple_with_heart_man_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],"char":'\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68',fitzpatrick_scale:!1,category:"people"},couplekiss_man_woman:{keywords:["pair","valentines","love","like","dating","marriage"],"char":'\ud83d\udc8f',fitzpatrick_scale:!1,category:"people"},couplekiss_woman_woman:{keywords:["pair","valentines","love","like","dating","marriage"],"char":'\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69',fitzpatrick_scale:!1,category:"people"},couplekiss_man_man:{keywords:["pair","valentines","love","like","dating","marriage"],"char":'\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68',fitzpatrick_scale:!1,category:"people"},family_man_woman_boy:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],"char":'\ud83d\udc6a',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],"char":'\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_woman_boy_boy:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_girl:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_boy:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy_boy:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_girl:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_man_boy:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_man_girl:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_man_girl_boy:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_man_boy_boy:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_man_girl_girl:{keywords:["home","parents","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_woman_boy:{keywords:["home","parent","people","human","child"],"char":'\ud83d\udc69\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_girl:{keywords:["home","parent","people","human","child"],"char":'\ud83d\udc69\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_woman_girl_boy:{keywords:["home","parent","people","human","children"],"char":'\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_boy_boy:{keywords:["home","parent","people","human","children"],"char":'\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_girl_girl:{keywords:["home","parent","people","human","children"],"char":'\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_boy:{keywords:["home","parent","people","human","child"],"char":'\ud83d\udc68\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_girl:{keywords:["home","parent","people","human","child"],"char":'\ud83d\udc68\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_girl_boy:{keywords:["home","parent","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_boy_boy:{keywords:["home","parent","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_girl_girl:{keywords:["home","parent","people","human","children"],"char":'\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},yarn:{keywords:["ball","crochet","knit"],"char":'\ud83e\uddf6',fitzpatrick_scale:!1,category:"people"},thread:{keywords:["needle","sewing","spool","string"],"char":'\ud83e\uddf5',fitzpatrick_scale:!1,category:"people"},coat:{keywords:["jacket"],"char":'\ud83e\udde5',fitzpatrick_scale:!1,category:"people"},labcoat:{keywords:["doctor","experiment","scientist","chemist"],"char":'\ud83e\udd7c',fitzpatrick_scale:!1,category:"people"},womans_clothes:{keywords:["fashion","shopping_bags","female"],"char":'\ud83d\udc5a',fitzpatrick_scale:!1,category:"people"},tshirt:{keywords:["fashion","cloth","casual","shirt","tee"],"char":'\ud83d\udc55',fitzpatrick_scale:!1,category:"people"},jeans:{keywords:["fashion","shopping"],"char":'\ud83d\udc56',fitzpatrick_scale:!1,category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],"char":'\ud83d\udc54',fitzpatrick_scale:!1,category:"people"},dress:{keywords:["clothes","fashion","shopping"],"char":'\ud83d\udc57',fitzpatrick_scale:!1,category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],"char":'\ud83d\udc59',fitzpatrick_scale:!1,category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],"char":'\ud83d\udc58',fitzpatrick_scale:!1,category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],"char":'\ud83d\udc84',fitzpatrick_scale:!1,category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],"char":'\ud83d\udc8b',fitzpatrick_scale:!1,category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],"char":'\ud83d\udc63',fitzpatrick_scale:!1,category:"people"},flat_shoe:{keywords:["ballet","slip-on","slipper"],"char":'\ud83e\udd7f',fitzpatrick_scale:!1,category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],"char":'\ud83d\udc60',fitzpatrick_scale:!1,category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],"char":'\ud83d\udc61',fitzpatrick_scale:!1,category:"people"},boot:{keywords:["shoes","fashion"],"char":'\ud83d\udc62',fitzpatrick_scale:!1,category:"people"},mans_shoe:{keywords:["fashion","male"],"char":'\ud83d\udc5e',fitzpatrick_scale:!1,category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],"char":'\ud83d\udc5f',fitzpatrick_scale:!1,category:"people"},hiking_boot:{keywords:["backpacking","camping","hiking"],"char":'\ud83e\udd7e',fitzpatrick_scale:!1,category:"people"},socks:{keywords:["stockings","clothes"],"char":'\ud83e\udde6',fitzpatrick_scale:!1,category:"people"},gloves:{keywords:["hands","winter","clothes"],"char":'\ud83e\udde4',fitzpatrick_scale:!1,category:"people"},scarf:{keywords:["neck","winter","clothes"],"char":'\ud83e\udde3',fitzpatrick_scale:!1,category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],"char":'\ud83d\udc52',fitzpatrick_scale:!1,category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],"char":'\ud83c\udfa9',fitzpatrick_scale:!1,category:"people"},billed_hat:{keywords:["cap","baseball"],"char":'\ud83e\udde2',fitzpatrick_scale:!1,category:"people"},rescue_worker_helmet:{keywords:["construction","build"],"char":'\u26d1',fitzpatrick_scale:!1,category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],"char":'\ud83c\udf93',fitzpatrick_scale:!1,category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],"char":'\ud83d\udc51',fitzpatrick_scale:!1,category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],"char":'\ud83c\udf92',fitzpatrick_scale:!1,category:"people"},luggage:{keywords:["packing","travel"],"char":'\ud83e\uddf3',fitzpatrick_scale:!1,category:"people"},pouch:{keywords:["bag","accessories","shopping"],"char":'\ud83d\udc5d',fitzpatrick_scale:!1,category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],"char":'\ud83d\udc5b',fitzpatrick_scale:!1,category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],"char":'\ud83d\udc5c',fitzpatrick_scale:!1,category:"people"},briefcase:{keywords:["business","documents","work","law","legal","job","career"],"char":'\ud83d\udcbc',fitzpatrick_scale:!1,category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],"char":'\ud83d\udc53',fitzpatrick_scale:!1,category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],"char":'\ud83d\udd76',fitzpatrick_scale:!1,category:"people"},goggles:{keywords:["eyes","protection","safety"],"char":'\ud83e\udd7d',fitzpatrick_scale:!1,category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],"char":'\ud83d\udc8d',fitzpatrick_scale:!1,category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],"char":'\ud83c\udf02',fitzpatrick_scale:!1,category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],"char":'\ud83d\udc36',fitzpatrick_scale:!1,category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],"char":'\ud83d\udc31',fitzpatrick_scale:!1,category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese_wedge","rodent"],"char":'\ud83d\udc2d',fitzpatrick_scale:!1,category:"animals_and_nature"},hamster:{keywords:["animal","nature"],"char":'\ud83d\udc39',fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],"char":'\ud83d\udc30',fitzpatrick_scale:!1,category:"animals_and_nature"},fox_face:{keywords:["animal","nature","face"],"char":'\ud83e\udd8a',fitzpatrick_scale:!1,category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],"char":'\ud83d\udc3b',fitzpatrick_scale:!1,category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],"char":'\ud83d\udc3c',fitzpatrick_scale:!1,category:"animals_and_nature"},koala:{keywords:["animal","nature"],"char":'\ud83d\udc28',fitzpatrick_scale:!1,category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],"char":'\ud83d\udc2f',fitzpatrick_scale:!1,category:"animals_and_nature"},lion:{keywords:["animal","nature"],"char":'\ud83e\udd81',fitzpatrick_scale:!1,category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],"char":'\ud83d\udc2e',fitzpatrick_scale:!1,category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],"char":'\ud83d\udc37',fitzpatrick_scale:!1,category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],"char":'\ud83d\udc3d',fitzpatrick_scale:!1,category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],"char":'\ud83d\udc38',fitzpatrick_scale:!1,category:"animals_and_nature"},squid:{keywords:["animal","nature","ocean","sea"],"char":'\ud83e\udd91',fitzpatrick_scale:!1,category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],"char":'\ud83d\udc19',fitzpatrick_scale:!1,category:"animals_and_nature"},shrimp:{keywords:["animal","ocean","nature","seafood"],"char":'\ud83e\udd90',fitzpatrick_scale:!1,category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],"char":'\ud83d\udc35',fitzpatrick_scale:!1,category:"animals_and_nature"},gorilla:{keywords:["animal","nature","circus"],"char":'\ud83e\udd8d',fitzpatrick_scale:!1,category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],"char":'\ud83d\ude48',fitzpatrick_scale:!1,category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],"char":'\ud83d\ude49',fitzpatrick_scale:!1,category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],"char":'\ud83d\ude4a',fitzpatrick_scale:!1,category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],"char":'\ud83d\udc12',fitzpatrick_scale:!1,category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],"char":'\ud83d\udc14',fitzpatrick_scale:!1,category:"animals_and_nature"},penguin:{keywords:["animal","nature"],"char":'\ud83d\udc27',fitzpatrick_scale:!1,category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],"char":'\ud83d\udc26',fitzpatrick_scale:!1,category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],"char":'\ud83d\udc24',fitzpatrick_scale:!1,category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],"char":'\ud83d\udc23',fitzpatrick_scale:!1,category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],"char":'\ud83d\udc25',fitzpatrick_scale:!1,category:"animals_and_nature"},duck:{keywords:["animal","nature","bird","mallard"],"char":'\ud83e\udd86',fitzpatrick_scale:!1,category:"animals_and_nature"},eagle:{keywords:["animal","nature","bird"],"char":'\ud83e\udd85',fitzpatrick_scale:!1,category:"animals_and_nature"},owl:{keywords:["animal","nature","bird","hoot"],"char":'\ud83e\udd89',fitzpatrick_scale:!1,category:"animals_and_nature"},bat:{keywords:["animal","nature","blind","vampire"],"char":'\ud83e\udd87',fitzpatrick_scale:!1,category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],"char":'\ud83d\udc3a',fitzpatrick_scale:!1,category:"animals_and_nature"},boar:{keywords:["animal","nature"],"char":'\ud83d\udc17',fitzpatrick_scale:!1,category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],"char":'\ud83d\udc34',fitzpatrick_scale:!1,category:"animals_and_nature"},unicorn:{keywords:["animal","nature","mystical"],"char":'\ud83e\udd84',fitzpatrick_scale:!1,category:"animals_and_nature"},honeybee:{keywords:["animal","insect","nature","bug","spring","honey"],"char":'\ud83d\udc1d',fitzpatrick_scale:!1,category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],"char":'\ud83d\udc1b',fitzpatrick_scale:!1,category:"animals_and_nature"},butterfly:{keywords:["animal","insect","nature","caterpillar"],"char":'\ud83e\udd8b',fitzpatrick_scale:!1,category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],"char":'\ud83d\udc0c',fitzpatrick_scale:!1,category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],"char":'\ud83d\udc1e',fitzpatrick_scale:!1,category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],"char":'\ud83d\udc1c',fitzpatrick_scale:!1,category:"animals_and_nature"},grasshopper:{keywords:["animal","cricket","chirp"],"char":'\ud83e\udd97',fitzpatrick_scale:!1,category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],"char":'\ud83d\udd77',fitzpatrick_scale:!1,category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],"char":'\ud83e\udd82',fitzpatrick_scale:!1,category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],"char":'\ud83e\udd80',fitzpatrick_scale:!1,category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],"char":'\ud83d\udc0d',fitzpatrick_scale:!1,category:"animals_and_nature"},lizard:{keywords:["animal","nature","reptile"],"char":'\ud83e\udd8e',fitzpatrick_scale:!1,category:"animals_and_nature"},"t-rex":{keywords:["animal","nature","dinosaur","tyrannosaurus","extinct"],"char":'\ud83e\udd96',fitzpatrick_scale:!1,category:"animals_and_nature"},sauropod:{keywords:["animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],"char":'\ud83e\udd95',fitzpatrick_scale:!1,category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],"char":'\ud83d\udc22',fitzpatrick_scale:!1,category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],"char":'\ud83d\udc20',fitzpatrick_scale:!1,category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],"char":'\ud83d\udc1f',fitzpatrick_scale:!1,category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],"char":'\ud83d\udc21',fitzpatrick_scale:!1,category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],"char":'\ud83d\udc2c',fitzpatrick_scale:!1,category:"animals_and_nature"},shark:{keywords:["animal","nature","fish","sea","ocean","jaws","fins","beach"],"char":'\ud83e\udd88',fitzpatrick_scale:!1,category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],"char":'\ud83d\udc33',fitzpatrick_scale:!1,category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],"char":'\ud83d\udc0b',fitzpatrick_scale:!1,category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],"char":'\ud83d\udc0a',fitzpatrick_scale:!1,category:"animals_and_nature"},leopard:{keywords:["animal","nature"],"char":'\ud83d\udc06',fitzpatrick_scale:!1,category:"animals_and_nature"},zebra:{keywords:["animal","nature","stripes","safari"],"char":'\ud83e\udd93',fitzpatrick_scale:!1,category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],"char":'\ud83d\udc05',fitzpatrick_scale:!1,category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],"char":'\ud83d\udc03',fitzpatrick_scale:!1,category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],"char":'\ud83d\udc02',fitzpatrick_scale:!1,category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],"char":'\ud83d\udc04',fitzpatrick_scale:!1,category:"animals_and_nature"},deer:{keywords:["animal","nature","horns","venison"],"char":'\ud83e\udd8c',fitzpatrick_scale:!1,category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],"char":'\ud83d\udc2a',fitzpatrick_scale:!1,category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],"char":'\ud83d\udc2b',fitzpatrick_scale:!1,category:"animals_and_nature"},giraffe:{keywords:["animal","nature","spots","safari"],"char":'\ud83e\udd92',fitzpatrick_scale:!1,category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","th","circus"],"char":'\ud83d\udc18',fitzpatrick_scale:!1,category:"animals_and_nature"},rhinoceros:{keywords:["animal","nature","horn"],"char":'\ud83e\udd8f',fitzpatrick_scale:!1,category:"animals_and_nature"},goat:{keywords:["animal","nature"],"char":'\ud83d\udc10',fitzpatrick_scale:!1,category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],"char":'\ud83d\udc0f',fitzpatrick_scale:!1,category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],"char":'\ud83d\udc11',fitzpatrick_scale:!1,category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],"char":'\ud83d\udc0e',fitzpatrick_scale:!1,category:"animals_and_nature"},pig2:{keywords:["animal","nature"],"char":'\ud83d\udc16',fitzpatrick_scale:!1,category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],"char":'\ud83d\udc00',fitzpatrick_scale:!1,category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],"char":'\ud83d\udc01',fitzpatrick_scale:!1,category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],"char":'\ud83d\udc13',fitzpatrick_scale:!1,category:"animals_and_nature"},turkey:{keywords:["animal","bird"],"char":'\ud83e\udd83',fitzpatrick_scale:!1,category:"animals_and_nature"},dove:{keywords:["animal","bird"],"char":'\ud83d\udd4a',fitzpatrick_scale:!1,category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],"char":'\ud83d\udc15',fitzpatrick_scale:!1,category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],"char":'\ud83d\udc29',fitzpatrick_scale:!1,category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],"char":'\ud83d\udc08',fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],"char":'\ud83d\udc07',fitzpatrick_scale:!1,category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],"char":'\ud83d\udc3f',fitzpatrick_scale:!1,category:"animals_and_nature"},hedgehog:{keywords:["animal","nature","spiny"],"char":'\ud83e\udd94',fitzpatrick_scale:!1,category:"animals_and_nature"},raccoon:{keywords:["animal","nature"],"char":'\ud83e\udd9d',fitzpatrick_scale:!1,category:"animals_and_nature"},llama:{keywords:["animal","nature","alpaca"],"char":'\ud83e\udd99',fitzpatrick_scale:!1,category:"animals_and_nature"},hippopotamus:{keywords:["animal","nature"],"char":'\ud83e\udd9b',fitzpatrick_scale:!1,category:"animals_and_nature"},kangaroo:{keywords:["animal","nature","australia","joey","hop","marsupial"],"char":'\ud83e\udd98',fitzpatrick_scale:!1,category:"animals_and_nature"},badger:{keywords:["animal","nature","honey"],"char":'\ud83e\udda1',fitzpatrick_scale:!1,category:"animals_and_nature"},swan:{keywords:["animal","nature","bird"],"char":'\ud83e\udda2',fitzpatrick_scale:!1,category:"animals_and_nature"},peacock:{keywords:["animal","nature","peahen","bird"],"char":'\ud83e\udd9a',fitzpatrick_scale:!1,category:"animals_and_nature"},parrot:{keywords:["animal","nature","bird","pirate","talk"],"char":'\ud83e\udd9c',fitzpatrick_scale:!1,category:"animals_and_nature"},lobster:{keywords:["animal","nature","bisque","claws","seafood"],"char":'\ud83e\udd9e',fitzpatrick_scale:!1,category:"animals_and_nature"},mosquito:{keywords:["animal","nature","insect","malaria"],"char":'\ud83e\udd9f',fitzpatrick_scale:!1,category:"animals_and_nature"},paw_prints:{keywords:["animal","tracking","footprints","dog","cat","pet","feet"],"char":'\ud83d\udc3e',fitzpatrick_scale:!1,category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],"char":'\ud83d\udc09',fitzpatrick_scale:!1,category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],"char":'\ud83d\udc32',fitzpatrick_scale:!1,category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],"char":'\ud83c\udf35',fitzpatrick_scale:!1,category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],"char":'\ud83c\udf84',fitzpatrick_scale:!1,category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],"char":'\ud83c\udf32',fitzpatrick_scale:!1,category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],"char":'\ud83c\udf33',fitzpatrick_scale:!1,category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],"char":'\ud83c\udf34',fitzpatrick_scale:!1,category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],"char":'\ud83c\udf31',fitzpatrick_scale:!1,category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],"char":'\ud83c\udf3f',fitzpatrick_scale:!1,category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],"char":'\u2618',fitzpatrick_scale:!1,category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],"char":'\ud83c\udf40',fitzpatrick_scale:!1,category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],"char":'\ud83c\udf8d',fitzpatrick_scale:!1,category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],"char":'\ud83c\udf8b',fitzpatrick_scale:!1,category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],"char":'\ud83c\udf43',fitzpatrick_scale:!1,category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],"char":'\ud83c\udf42',fitzpatrick_scale:!1,category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","ca","fall"],"char":'\ud83c\udf41',fitzpatrick_scale:!1,category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],"char":'\ud83c\udf3e',fitzpatrick_scale:!1,category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],"char":'\ud83c\udf3a',fitzpatrick_scale:!1,category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],"char":'\ud83c\udf3b',fitzpatrick_scale:!1,category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],"char":'\ud83c\udf39',fitzpatrick_scale:!1,category:"animals_and_nature"},wilted_flower:{keywords:["plant","nature","flower"],"char":'\ud83e\udd40',fitzpatrick_scale:!1,category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],"char":'\ud83c\udf37',fitzpatrick_scale:!1,category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],"char":'\ud83c\udf3c',fitzpatrick_scale:!1,category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],"char":'\ud83c\udf38',fitzpatrick_scale:!1,category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],"char":'\ud83d\udc90',fitzpatrick_scale:!1,category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],"char":'\ud83c\udf44',fitzpatrick_scale:!1,category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],"char":'\ud83c\udf30',fitzpatrick_scale:!1,category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],"char":'\ud83c\udf83',fitzpatrick_scale:!1,category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],"char":'\ud83d\udc1a',fitzpatrick_scale:!1,category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],"char":'\ud83d\udd78',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],"char":'\ud83c\udf0e',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],"char":'\ud83c\udf0d',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],"char":'\ud83c\udf0f',fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],"char":'\ud83c\udf15',fitzpatrick_scale:!1,category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],"char":'\ud83c\udf16',fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":'\ud83c\udf17',fitzpatrick_scale:!1,category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":'\ud83c\udf18',fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":'\ud83c\udf11',fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":'\ud83c\udf12',fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":'\ud83c\udf13',fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_gibbous_moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],"char":'\ud83c\udf14',fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":'\ud83c\udf1a',fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":'\ud83c\udf1d',fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":'\ud83c\udf1b',fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":'\ud83c\udf1c',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],"char":'\ud83c\udf1e',fitzpatrick_scale:!1,category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],"char":'\ud83c\udf19',fitzpatrick_scale:!1,category:"animals_and_nature"},star:{keywords:["night","yellow"],"char":'\u2b50',fitzpatrick_scale:!1,category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],"char":'\ud83c\udf1f',fitzpatrick_scale:!1,category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],"char":'\ud83d\udcab',fitzpatrick_scale:!1,category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],"char":'\u2728',fitzpatrick_scale:!1,category:"animals_and_nature"},comet:{keywords:["space"],"char":'\u2604',fitzpatrick_scale:!1,category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],"char":'\u2600\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_small_cloud:{keywords:["weather"],"char":'\ud83c\udf24',fitzpatrick_scale:!1,category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],"char":'\u26c5',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_large_cloud:{keywords:["weather"],"char":'\ud83c\udf25',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_rain_cloud:{keywords:["weather"],"char":'\ud83c\udf26',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud:{keywords:["weather","sky"],"char":'\u2601\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],"char":'\ud83c\udf27',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning_and_rain:{keywords:["weather","lightning"],"char":'\u26c8',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],"char":'\ud83c\udf29',fitzpatrick_scale:!1,category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],"char":'\u26a1',fitzpatrick_scale:!1,category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],"char":'\ud83d\udd25',fitzpatrick_scale:!1,category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],"char":'\ud83d\udca5',fitzpatrick_scale:!1,category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],"char":'\u2744\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],"char":'\ud83c\udf28',fitzpatrick_scale:!1,category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],"char":'\u26c4',fitzpatrick_scale:!1,category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],"char":'\u2603',fitzpatrick_scale:!1,category:"animals_and_nature"},wind_face:{keywords:["gust","air"],"char":'\ud83c\udf2c',fitzpatrick_scale:!1,category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],"char":'\ud83d\udca8',fitzpatrick_scale:!1,category:"animals_and_nature"},tornado:{keywords:["weather","cyclone","twister"],"char":'\ud83c\udf2a',fitzpatrick_scale:!1,category:"animals_and_nature"},fog:{keywords:["weather"],"char":'\ud83c\udf2b',fitzpatrick_scale:!1,category:"animals_and_nature"},open_umbrella:{keywords:["weather","spring"],"char":'\u2602',fitzpatrick_scale:!1,category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],"char":'\u2614',fitzpatrick_scale:!1,category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],"char":'\ud83d\udca7',fitzpatrick_scale:!1,category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],"char":'\ud83d\udca6',fitzpatrick_scale:!1,category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],"char":'\ud83c\udf0a',fitzpatrick_scale:!1,category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],"char":'\ud83c\udf4f',fitzpatrick_scale:!1,category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],"char":'\ud83c\udf4e',fitzpatrick_scale:!1,category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],"char":'\ud83c\udf50',fitzpatrick_scale:!1,category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],"char":'\ud83c\udf4a',fitzpatrick_scale:!1,category:"food_and_drink"},lemon:{keywords:["fruit","nature"],"char":'\ud83c\udf4b',fitzpatrick_scale:!1,category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],"char":'\ud83c\udf4c',fitzpatrick_scale:!1,category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],"char":'\ud83c\udf49',fitzpatrick_scale:!1,category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],"char":'\ud83c\udf47',fitzpatrick_scale:!1,category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],"char":'\ud83c\udf53',fitzpatrick_scale:!1,category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],"char":'\ud83c\udf48',fitzpatrick_scale:!1,category:"food_and_drink"},cherries:{keywords:["food","fruit"],"char":'\ud83c\udf52',fitzpatrick_scale:!1,category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],"char":'\ud83c\udf51',fitzpatrick_scale:!1,category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],"char":'\ud83c\udf4d',fitzpatrick_scale:!1,category:"food_and_drink"},coconut:{keywords:["fruit","nature","food","palm"],"char":'\ud83e\udd65',fitzpatrick_scale:!1,category:"food_and_drink"},kiwi_fruit:{keywords:["fruit","food"],"char":'\ud83e\udd5d',fitzpatrick_scale:!1,category:"food_and_drink"},mango:{keywords:["fruit","food","tropical"],"char":'\ud83e\udd6d',fitzpatrick_scale:!1,category:"food_and_drink"},avocado:{keywords:["fruit","food"],"char":'\ud83e\udd51',fitzpatrick_scale:!1,category:"food_and_drink"},broccoli:{keywords:["fruit","food","vegetable"],"char":'\ud83e\udd66',fitzpatrick_scale:!1,category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],"char":'\ud83c\udf45',fitzpatrick_scale:!1,category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],"char":'\ud83c\udf46',fitzpatrick_scale:!1,category:"food_and_drink"},cucumber:{keywords:["fruit","food","pickle"],"char":'\ud83e\udd52',fitzpatrick_scale:!1,category:"food_and_drink"},carrot:{keywords:["vegetable","food","orange"],"char":'\ud83e\udd55',fitzpatrick_scale:!1,category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],"char":'\ud83c\udf36',fitzpatrick_scale:!1,category:"food_and_drink"},potato:{keywords:["food","tuber","vegatable","starch"],"char":'\ud83e\udd54',fitzpatrick_scale:!1,category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],"char":'\ud83c\udf3d',fitzpatrick_scale:!1,category:"food_and_drink"},leafy_greens:{keywords:["food","vegetable","plant","bok choy","cabbage","kale","lettuce"],"char":'\ud83e\udd6c',fitzpatrick_scale:!1,category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],"char":'\ud83c\udf60',fitzpatrick_scale:!1,category:"food_and_drink"},peanuts:{keywords:["food","nut"],"char":'\ud83e\udd5c',fitzpatrick_scale:!1,category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],"char":'\ud83c\udf6f',fitzpatrick_scale:!1,category:"food_and_drink"},croissant:{keywords:["food","bread","french"],"char":'\ud83e\udd50',fitzpatrick_scale:!1,category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],"char":'\ud83c\udf5e',fitzpatrick_scale:!1,category:"food_and_drink"},baguette_bread:{keywords:["food","bread","french"],"char":'\ud83e\udd56',fitzpatrick_scale:!1,category:"food_and_drink"},bagel:{keywords:["food","bread","bakery","schmear"],"char":'\ud83e\udd6f',fitzpatrick_scale:!1,category:"food_and_drink"},pretzel:{keywords:["food","bread","twisted"],"char":'\ud83e\udd68',fitzpatrick_scale:!1,category:"food_and_drink"},cheese:{keywords:["food","chadder"],"char":'\ud83e\uddc0',fitzpatrick_scale:!1,category:"food_and_drink"},egg:{keywords:["food","chicken","breakfast"],"char":'\ud83e\udd5a',fitzpatrick_scale:!1,category:"food_and_drink"},bacon:{keywords:["food","breakfast","pork","pig","meat"],"char":'\ud83e\udd53',fitzpatrick_scale:!1,category:"food_and_drink"},steak:{keywords:["food","cow","meat","cut","chop","lambchop","porkchop"],"char":'\ud83e\udd69',fitzpatrick_scale:!1,category:"food_and_drink"},pancakes:{keywords:["food","breakfast","flapjacks","hotcakes"],"char":'\ud83e\udd5e',fitzpatrick_scale:!1,category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],"char":'\ud83c\udf57',fitzpatrick_scale:!1,category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],"char":'\ud83c\udf56',fitzpatrick_scale:!1,category:"food_and_drink"},bone:{keywords:["skeleton"],"char":'\ud83e\uddb4',fitzpatrick_scale:!1,category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],"char":'\ud83c\udf64',fitzpatrick_scale:!1,category:"food_and_drink"},fried_egg:{keywords:["food","breakfast","kitchen","egg"],"char":'\ud83c\udf73',fitzpatrick_scale:!1,category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],"char":'\ud83c\udf54',fitzpatrick_scale:!1,category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],"char":'\ud83c\udf5f',fitzpatrick_scale:!1,category:"food_and_drink"},stuffed_flatbread:{keywords:["food","flatbread","stuffed","gyro"],"char":'\ud83e\udd59',fitzpatrick_scale:!1,category:"food_and_drink"},hotdog:{keywords:["food","frankfurter"],"char":'\ud83c\udf2d',fitzpatrick_scale:!1,category:"food_and_drink"},pizza:{keywords:["food","party"],"char":'\ud83c\udf55',fitzpatrick_scale:!1,category:"food_and_drink"},sandwich:{keywords:["food","lunch","bread"],"char":'\ud83e\udd6a',fitzpatrick_scale:!1,category:"food_and_drink"},canned_food:{keywords:["food","soup"],"char":'\ud83e\udd6b',fitzpatrick_scale:!1,category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],"char":'\ud83c\udf5d',fitzpatrick_scale:!1,category:"food_and_drink"},taco:{keywords:["food","mexican"],"char":'\ud83c\udf2e',fitzpatrick_scale:!1,category:"food_and_drink"},burrito:{keywords:["food","mexican"],"char":'\ud83c\udf2f',fitzpatrick_scale:!1,category:"food_and_drink"},green_salad:{keywords:["food","healthy","lettuce"],"char":'\ud83e\udd57',fitzpatrick_scale:!1,category:"food_and_drink"},shallow_pan_of_food:{keywords:["food","cooking","casserole","paella"],"char":'\ud83e\udd58',fitzpatrick_scale:!1,category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],"char":'\ud83c\udf5c',fitzpatrick_scale:!1,category:"food_and_drink"},stew:{keywords:["food","meat","soup"],"char":'\ud83c\udf72',fitzpatrick_scale:!1,category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"],"char":'\ud83c\udf65',fitzpatrick_scale:!1,category:"food_and_drink"},fortune_cookie:{keywords:["food","prophecy"],"char":'\ud83e\udd60',fitzpatrick_scale:!1,category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],"char":'\ud83c\udf63',fitzpatrick_scale:!1,category:"food_and_drink"},bento:{keywords:["food","japanese","box"],"char":'\ud83c\udf71',fitzpatrick_scale:!1,category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],"char":'\ud83c\udf5b',fitzpatrick_scale:!1,category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],"char":'\ud83c\udf59',fitzpatrick_scale:!1,category:"food_and_drink"},rice:{keywords:["food","china","asian"],"char":'\ud83c\udf5a',fitzpatrick_scale:!1,category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],"char":'\ud83c\udf58',fitzpatrick_scale:!1,category:"food_and_drink"},oden:{keywords:["food","japanese"],"char":'\ud83c\udf62',fitzpatrick_scale:!1,category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],"char":'\ud83c\udf61',fitzpatrick_scale:!1,category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],"char":'\ud83c\udf67',fitzpatrick_scale:!1,category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],"char":'\ud83c\udf68',fitzpatrick_scale:!1,category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],"char":'\ud83c\udf66',fitzpatrick_scale:!1,category:"food_and_drink"},pie:{keywords:["food","dessert","pastry"],"char":'\ud83e\udd67',fitzpatrick_scale:!1,category:"food_and_drink"},cake:{keywords:["food","dessert"],"char":'\ud83c\udf70',fitzpatrick_scale:!1,category:"food_and_drink"},cupcake:{keywords:["food","dessert","bakery","sweet"],"char":'\ud83e\uddc1',fitzpatrick_scale:!1,category:"food_and_drink"},moon_cake:{keywords:["food","autumn"],"char":'\ud83e\udd6e',fitzpatrick_scale:!1,category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],"char":'\ud83c\udf82',fitzpatrick_scale:!1,category:"food_and_drink"},custard:{keywords:["dessert","food"],"char":'\ud83c\udf6e',fitzpatrick_scale:!1,category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],"char":'\ud83c\udf6c',fitzpatrick_scale:!1,category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],"char":'\ud83c\udf6d',fitzpatrick_scale:!1,category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],"char":'\ud83c\udf6b',fitzpatrick_scale:!1,category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],"char":'\ud83c\udf7f',fitzpatrick_scale:!1,category:"food_and_drink"},dumpling:{keywords:["food","empanada","pierogi","potsticker"],"char":'\ud83e\udd5f',fitzpatrick_scale:!1,category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],"char":'\ud83c\udf69',fitzpatrick_scale:!1,category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],"char":'\ud83c\udf6a',fitzpatrick_scale:!1,category:"food_and_drink"},milk_glass:{keywords:["beverage","drink","cow"],"char":'\ud83e\udd5b',fitzpatrick_scale:!1,category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],"char":'\ud83c\udf7a',fitzpatrick_scale:!1,category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],"char":'\ud83c\udf7b',fitzpatrick_scale:!1,category:"food_and_drink"},clinking_glasses:{keywords:["beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],"char":'\ud83e\udd42',fitzpatrick_scale:!1,category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],"char":'\ud83c\udf77',fitzpatrick_scale:!1,category:"food_and_drink"},tumbler_glass:{keywords:["drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],"char":'\ud83e\udd43',fitzpatrick_scale:!1,category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],"char":'\ud83c\udf78',fitzpatrick_scale:!1,category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],"char":'\ud83c\udf79',fitzpatrick_scale:!1,category:"food_and_drink"},champagne:{keywords:["drink","wine","bottle","celebration"],"char":'\ud83c\udf7e',fitzpatrick_scale:!1,category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],"char":'\ud83c\udf76',fitzpatrick_scale:!1,category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],"char":'\ud83c\udf75',fitzpatrick_scale:!1,category:"food_and_drink"},cup_with_straw:{keywords:["drink","soda"],"char":'\ud83e\udd64',fitzpatrick_scale:!1,category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],"char":'\u2615',fitzpatrick_scale:!1,category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],"char":'\ud83c\udf7c',fitzpatrick_scale:!1,category:"food_and_drink"},salt:{keywords:["condiment","shaker"],"char":'\ud83e\uddc2',fitzpatrick_scale:!1,category:"food_and_drink"},spoon:{keywords:["cutlery","kitchen","tableware"],"char":'\ud83e\udd44',fitzpatrick_scale:!1,category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],"char":'\ud83c\udf74',fitzpatrick_scale:!1,category:"food_and_drink"},plate_with_cutlery:{keywords:["food","eat","meal","lunch","dinner","restaurant"],"char":'\ud83c\udf7d',fitzpatrick_scale:!1,category:"food_and_drink"},bowl_with_spoon:{keywords:["food","breakfast","cereal","oatmeal","porridge"],"char":'\ud83e\udd63',fitzpatrick_scale:!1,category:"food_and_drink"},takeout_box:{keywords:["food","leftovers"],"char":'\ud83e\udd61',fitzpatrick_scale:!1,category:"food_and_drink"},chopsticks:{keywords:["food"],"char":'\ud83e\udd62',fitzpatrick_scale:!1,category:"food_and_drink"},soccer:{keywords:["sports","football"],"char":'\u26bd',fitzpatrick_scale:!1,category:"activity"},basketball:{keywords:["sports","balls","NBA"],"char":'\ud83c\udfc0',fitzpatrick_scale:!1,category:"activity"},football:{keywords:["sports","balls","NFL"],"char":'\ud83c\udfc8',fitzpatrick_scale:!1,category:"activity"},baseball:{keywords:["sports","balls"],"char":'\u26be',fitzpatrick_scale:!1,category:"activity"},softball:{keywords:["sports","balls"],"char":'\ud83e\udd4e',fitzpatrick_scale:!1,category:"activity"},tennis:{keywords:["sports","balls","green"],"char":'\ud83c\udfbe',fitzpatrick_scale:!1,category:"activity"},volleyball:{keywords:["sports","balls"],"char":'\ud83c\udfd0',fitzpatrick_scale:!1,category:"activity"},rugby_football:{keywords:["sports","team"],"char":'\ud83c\udfc9',fitzpatrick_scale:!1,category:"activity"},flying_disc:{keywords:["sports","frisbee","ultimate"],"char":'\ud83e\udd4f',fitzpatrick_scale:!1,category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],"char":'\ud83c\udfb1',fitzpatrick_scale:!1,category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],"char":'\u26f3',fitzpatrick_scale:!1,category:"activity"},golfing_woman:{keywords:["sports","business","woman","female"],"char":'\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"activity"},golfing_man:{keywords:["sports","business"],"char":'\ud83c\udfcc',fitzpatrick_scale:!0,category:"activity"},ping_pong:{keywords:["sports","pingpong"],"char":'\ud83c\udfd3',fitzpatrick_scale:!1,category:"activity"},badminton:{keywords:["sports"],"char":'\ud83c\udff8',fitzpatrick_scale:!1,category:"activity"},goal_net:{keywords:["sports"],"char":'\ud83e\udd45',fitzpatrick_scale:!1,category:"activity"},ice_hockey:{keywords:["sports"],"char":'\ud83c\udfd2',fitzpatrick_scale:!1,category:"activity"},field_hockey:{keywords:["sports"],"char":'\ud83c\udfd1',fitzpatrick_scale:!1,category:"activity"},lacrosse:{keywords:["sports","ball","stick"],"char":'\ud83e\udd4d',fitzpatrick_scale:!1,category:"activity"},cricket:{keywords:["sports"],"char":'\ud83c\udfcf',fitzpatrick_scale:!1,category:"activity"},ski:{keywords:["sports","winter","cold","snow"],"char":'\ud83c\udfbf',fitzpatrick_scale:!1,category:"activity"},skier:{keywords:["sports","winter","snow"],"char":'\u26f7',fitzpatrick_scale:!1,category:"activity"},snowboarder:{keywords:["sports","winter"],"char":'\ud83c\udfc2',fitzpatrick_scale:!0,category:"activity"},person_fencing:{keywords:["sports","fencing","sword"],"char":'\ud83e\udd3a',fitzpatrick_scale:!1,category:"activity"},women_wrestling:{keywords:["sports","wrestlers"],"char":'\ud83e\udd3c\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"activity"},men_wrestling:{keywords:["sports","wrestlers"],"char":'\ud83e\udd3c\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"activity"},woman_cartwheeling:{keywords:["gymnastics"],"char":'\ud83e\udd38\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_cartwheeling:{keywords:["gymnastics"],"char":'\ud83e\udd38\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},woman_playing_handball:{keywords:["sports"],"char":'\ud83e\udd3e\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_playing_handball:{keywords:["sports"],"char":'\ud83e\udd3e\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},ice_skate:{keywords:["sports"],"char":'\u26f8',fitzpatrick_scale:!1,category:"activity"},curling_stone:{keywords:["sports"],"char":'\ud83e\udd4c',fitzpatrick_scale:!1,category:"activity"},skateboard:{keywords:["board"],"char":'\ud83d\udef9',fitzpatrick_scale:!1,category:"activity"},sled:{keywords:["sleigh","luge","toboggan"],"char":'\ud83d\udef7',fitzpatrick_scale:!1,category:"activity"},bow_and_arrow:{keywords:["sports"],"char":'\ud83c\udff9',fitzpatrick_scale:!1,category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],"char":'\ud83c\udfa3',fitzpatrick_scale:!1,category:"activity"},boxing_glove:{keywords:["sports","fighting"],"char":'\ud83e\udd4a',fitzpatrick_scale:!1,category:"activity"},martial_arts_uniform:{keywords:["judo","karate","taekwondo"],"char":'\ud83e\udd4b',fitzpatrick_scale:!1,category:"activity"},rowing_woman:{keywords:["sports","hobby","water","ship","woman","female"],"char":'\ud83d\udea3\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},rowing_man:{keywords:["sports","hobby","water","ship"],"char":'\ud83d\udea3',fitzpatrick_scale:!0,category:"activity"},climbing_woman:{keywords:["sports","hobby","woman","female","rock"],"char":'\ud83e\uddd7\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},climbing_man:{keywords:["sports","hobby","man","male","rock"],"char":'\ud83e\uddd7\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},swimming_woman:{keywords:["sports","exercise","human","athlete","water","summer","woman","female"],"char":'\ud83c\udfca\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},swimming_man:{keywords:["sports","exercise","human","athlete","water","summer"],"char":'\ud83c\udfca',fitzpatrick_scale:!0,category:"activity"},woman_playing_water_polo:{keywords:["sports","pool"],"char":'\ud83e\udd3d\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_playing_water_polo:{keywords:["sports","pool"],"char":'\ud83e\udd3d\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},woman_in_lotus_position:{keywords:["woman","female","meditation","yoga","serenity","zen","mindfulness"],"char":'\ud83e\uddd8\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_in_lotus_position:{keywords:["man","male","meditation","yoga","serenity","zen","mindfulness"],"char":'\ud83e\uddd8\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},surfing_woman:{keywords:["sports","ocean","sea","summer","beach","woman","female"],"char":'\ud83c\udfc4\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},surfing_man:{keywords:["sports","ocean","sea","summer","beach"],"char":'\ud83c\udfc4',fitzpatrick_scale:!0,category:"activity"},bath:{keywords:["clean","shower","bathroom"],"char":'\ud83d\udec0',fitzpatrick_scale:!0,category:"activity"},basketball_woman:{keywords:["sports","human","woman","female"],"char":'\u26f9\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},basketball_man:{keywords:["sports","human"],"char":'\u26f9',fitzpatrick_scale:!0,category:"activity"},weight_lifting_woman:{keywords:["sports","training","exercise","woman","female"],"char":'\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},weight_lifting_man:{keywords:["sports","training","exercise"],"char":'\ud83c\udfcb',fitzpatrick_scale:!0,category:"activity"},biking_woman:{keywords:["sports","bike","exercise","hipster","woman","female"],"char":'\ud83d\udeb4\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},biking_man:{keywords:["sports","bike","exercise","hipster"],"char":'\ud83d\udeb4',fitzpatrick_scale:!0,category:"activity"},mountain_biking_woman:{keywords:["transportation","sports","human","race","bike","woman","female"],"char":'\ud83d\udeb5\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},mountain_biking_man:{keywords:["transportation","sports","human","race","bike"],"char":'\ud83d\udeb5',fitzpatrick_scale:!0,category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],"char":'\ud83c\udfc7',fitzpatrick_scale:!0,category:"activity"},business_suit_levitating:{keywords:["suit","business","levitate","hover","jump"],"char":'\ud83d\udd74',fitzpatrick_scale:!0,category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],"char":'\ud83c\udfc6',fitzpatrick_scale:!1,category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],"char":'\ud83c\udfbd',fitzpatrick_scale:!1,category:"activity"},medal_sports:{keywords:["award","winning"],"char":'\ud83c\udfc5',fitzpatrick_scale:!1,category:"activity"},medal_military:{keywords:["award","winning","army"],"char":'\ud83c\udf96',fitzpatrick_scale:!1,category:"activity"},"1st_place_medal":{keywords:["award","winning","first"],"char":'\ud83e\udd47',fitzpatrick_scale:!1,category:"activity"},"2nd_place_medal":{keywords:["award","second"],"char":'\ud83e\udd48',fitzpatrick_scale:!1,category:"activity"},"3rd_place_medal":{keywords:["award","third"],"char":'\ud83e\udd49',fitzpatrick_scale:!1,category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],"char":'\ud83c\udf97',fitzpatrick_scale:!1,category:"activity"},rosette:{keywords:["flower","decoration","military"],"char":'\ud83c\udff5',fitzpatrick_scale:!1,category:"activity"},ticket:{keywords:["event","concert","pass"],"char":'\ud83c\udfab',fitzpatrick_scale:!1,category:"activity"},tickets:{keywords:["sports","concert","entrance"],"char":'\ud83c\udf9f',fitzpatrick_scale:!1,category:"activity"},performing_arts:{keywords:["acting","theater","drama"],"char":'\ud83c\udfad',fitzpatrick_scale:!1,category:"activity"},art:{keywords:["design","paint","draw","colors"],"char":'\ud83c\udfa8',fitzpatrick_scale:!1,category:"activity"},circus_tent:{keywords:["festival","carnival","party"],"char":'\ud83c\udfaa',fitzpatrick_scale:!1,category:"activity"},woman_juggling:{keywords:["juggle","balance","skill","multitask"],"char":'\ud83e\udd39\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_juggling:{keywords:["juggle","balance","skill","multitask"],"char":'\ud83e\udd39\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},microphone:{keywords:["sound","music","PA","sing","talkshow"],"char":'\ud83c\udfa4',fitzpatrick_scale:!1,category:"activity"},headphones:{keywords:["music","score","gadgets"],"char":'\ud83c\udfa7',fitzpatrick_scale:!1,category:"activity"},musical_score:{keywords:["treble","clef","compose"],"char":'\ud83c\udfbc',fitzpatrick_scale:!1,category:"activity"},musical_keyboard:{keywords:["piano","instrument","compose"],"char":'\ud83c\udfb9',fitzpatrick_scale:!1,category:"activity"},drum:{keywords:["music","instrument","drumsticks","snare"],"char":'\ud83e\udd41',fitzpatrick_scale:!1,category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],"char":'\ud83c\udfb7',fitzpatrick_scale:!1,category:"activity"},trumpet:{keywords:["music","brass"],"char":'\ud83c\udfba',fitzpatrick_scale:!1,category:"activity"},guitar:{keywords:["music","instrument"],"char":'\ud83c\udfb8',fitzpatrick_scale:!1,category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],"char":'\ud83c\udfbb',fitzpatrick_scale:!1,category:"activity"},clapper:{keywords:["movie","film","record"],"char":'\ud83c\udfac',fitzpatrick_scale:!1,category:"activity"},video_game:{keywords:["play","console","PS4","controller"],"char":'\ud83c\udfae',fitzpatrick_scale:!1,category:"activity"},space_invader:{keywords:["game","arcade","play"],"char":'\ud83d\udc7e',fitzpatrick_scale:!1,category:"activity"},dart:{keywords:["game","play","bar","target","bullseye"],"char":'\ud83c\udfaf',fitzpatrick_scale:!1,category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],"char":'\ud83c\udfb2',fitzpatrick_scale:!1,category:"activity"},chess_pawn:{keywords:["expendable"],"char":"\u265f",fitzpatrick_scale:!1,category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],"char":'\ud83c\udfb0',fitzpatrick_scale:!1,category:"activity"},jigsaw:{keywords:["interlocking","puzzle","piece"],"char":'\ud83e\udde9',fitzpatrick_scale:!1,category:"activity"},bowling:{keywords:["sports","fun","play"],"char":'\ud83c\udfb3',fitzpatrick_scale:!1,category:"activity"},red_car:{keywords:["red","transportation","vehicle"],"char":'\ud83d\ude97',fitzpatrick_scale:!1,category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],"char":'\ud83d\ude95',fitzpatrick_scale:!1,category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],"char":'\ud83d\ude99',fitzpatrick_scale:!1,category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],"char":'\ud83d\ude8c',fitzpatrick_scale:!1,category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],"char":'\ud83d\ude8e',fitzpatrick_scale:!1,category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],"char":'\ud83c\udfce',fitzpatrick_scale:!1,category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],"char":'\ud83d\ude93',fitzpatrick_scale:!1,category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],"char":'\ud83d\ude91',fitzpatrick_scale:!1,category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],"char":'\ud83d\ude92',fitzpatrick_scale:!1,category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],"char":'\ud83d\ude90',fitzpatrick_scale:!1,category:"travel_and_places"},truck:{keywords:["cars","transportation"],"char":'\ud83d\ude9a',fitzpatrick_scale:!1,category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],"char":'\ud83d\ude9b',fitzpatrick_scale:!1,category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],"char":'\ud83d\ude9c',fitzpatrick_scale:!1,category:"travel_and_places"},kick_scooter:{keywords:["vehicle","kick","razor"],"char":'\ud83d\udef4',fitzpatrick_scale:!1,category:"travel_and_places"},motorcycle:{keywords:["race","sports","fast"],"char":'\ud83c\udfcd',fitzpatrick_scale:!1,category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],"char":'\ud83d\udeb2',fitzpatrick_scale:!1,category:"travel_and_places"},motor_scooter:{keywords:["vehicle","vespa","sasha"],"char":'\ud83d\udef5',fitzpatrick_scale:!1,category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],"char":'\ud83d\udea8',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],"char":'\ud83d\ude94',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],"char":'\ud83d\ude8d',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],"char":'\ud83d\ude98',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],"char":'\ud83d\ude96',fitzpatrick_scale:!1,category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],"char":'\ud83d\udea1',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],"char":'\ud83d\udea0',fitzpatrick_scale:!1,category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],"char":'\ud83d\ude9f',fitzpatrick_scale:!1,category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],"char":'\ud83d\ude83',fitzpatrick_scale:!1,category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],"char":'\ud83d\ude8b',fitzpatrick_scale:!1,category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],"char":'\ud83d\ude9d',fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],"char":'\ud83d\ude84',fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],"char":'\ud83d\ude85',fitzpatrick_scale:!1,category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],"char":'\ud83d\ude88',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],"char":'\ud83d\ude9e',fitzpatrick_scale:!1,category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],"char":'\ud83d\ude82',fitzpatrick_scale:!1,category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],"char":'\ud83d\ude86',fitzpatrick_scale:!1,category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],"char":'\ud83d\ude87',fitzpatrick_scale:!1,category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],"char":'\ud83d\ude8a',fitzpatrick_scale:!1,category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],"char":'\ud83d\ude89',fitzpatrick_scale:!1,category:"travel_and_places"},flying_saucer:{keywords:["transportation","vehicle","ufo"],"char":'\ud83d\udef8',fitzpatrick_scale:!1,category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],"char":'\ud83d\ude81',fitzpatrick_scale:!1,category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],"char":'\ud83d\udee9',fitzpatrick_scale:!1,category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],"char":'\u2708\ufe0f',fitzpatrick_scale:!1,category:"travel_and_places"},flight_departure:{keywords:["airport","flight","landing"],"char":'\ud83d\udeeb',fitzpatrick_scale:!1,category:"travel_and_places"},flight_arrival:{keywords:["airport","flight","boarding"],"char":'\ud83d\udeec',fitzpatrick_scale:!1,category:"travel_and_places"},sailboat:{keywords:["ship","summer","transportation","water","sailing"],"char":'\u26f5',fitzpatrick_scale:!1,category:"travel_and_places"},motor_boat:{keywords:["ship"],"char":'\ud83d\udee5',fitzpatrick_scale:!1,category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],"char":'\ud83d\udea4',fitzpatrick_scale:!1,category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],"char":'\u26f4',fitzpatrick_scale:!1,category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],"char":'\ud83d\udef3',fitzpatrick_scale:!1,category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],"char":'\ud83d\ude80',fitzpatrick_scale:!1,category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],"char":'\ud83d\udef0',fitzpatrick_scale:!1,category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],"char":'\ud83d\udcba',fitzpatrick_scale:!1,category:"travel_and_places"},canoe:{keywords:["boat","paddle","water","ship"],"char":'\ud83d\udef6',fitzpatrick_scale:!1,category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],"char":'\u2693',fitzpatrick_scale:!1,category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],"char":'\ud83d\udea7',fitzpatrick_scale:!1,category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],"char":'\u26fd',fitzpatrick_scale:!1,category:"travel_and_places"},busstop:{keywords:["transportation","wait"],"char":'\ud83d\ude8f',fitzpatrick_scale:!1,category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],"char":'\ud83d\udea6',fitzpatrick_scale:!1,category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],"char":'\ud83d\udea5',fitzpatrick_scale:!1,category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],"char":'\ud83c\udfc1',fitzpatrick_scale:!1,category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],"char":'\ud83d\udea2',fitzpatrick_scale:!1,category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],"char":'\ud83c\udfa1',fitzpatrick_scale:!1,category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],"char":'\ud83c\udfa2',fitzpatrick_scale:!1,category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],"char":'\ud83c\udfa0',fitzpatrick_scale:!1,category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],"char":'\ud83c\udfd7',fitzpatrick_scale:!1,category:"travel_and_places"},foggy:{keywords:["photo","mountain"],"char":'\ud83c\udf01',fitzpatrick_scale:!1,category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],"char":'\ud83d\uddfc',fitzpatrick_scale:!1,category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],"char":'\ud83c\udfed',fitzpatrick_scale:!1,category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],"char":'\u26f2',fitzpatrick_scale:!1,category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],"char":'\ud83c\udf91',fitzpatrick_scale:!1,category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],"char":'\u26f0',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_snow:{keywords:["photo","nature","environment","winter","cold"],"char":'\ud83c\udfd4',fitzpatrick_scale:!1,category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],"char":'\ud83d\uddfb',fitzpatrick_scale:!1,category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],"char":'\ud83c\udf0b',fitzpatrick_scale:!1,category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],"char":'\ud83d\uddfe',fitzpatrick_scale:!1,category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],"char":'\ud83c\udfd5',fitzpatrick_scale:!1,category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],"char":'\u26fa',fitzpatrick_scale:!1,category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],"char":'\ud83c\udfde',fitzpatrick_scale:!1,category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],"char":'\ud83d\udee3',fitzpatrick_scale:!1,category:"travel_and_places"},railway_track:{keywords:["train","transportation"],"char":'\ud83d\udee4',fitzpatrick_scale:!1,category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],"char":'\ud83c\udf05',fitzpatrick_scale:!1,category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],"char":'\ud83c\udf04',fitzpatrick_scale:!1,category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],"char":'\ud83c\udfdc',fitzpatrick_scale:!1,category:"travel_and_places"},beach_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],"char":'\ud83c\udfd6',fitzpatrick_scale:!1,category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],"char":'\ud83c\udfdd',fitzpatrick_scale:!1,category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],"char":'\ud83c\udf07',fitzpatrick_scale:!1,category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],"char":'\ud83c\udf06',fitzpatrick_scale:!1,category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],"char":'\ud83c\udfd9',fitzpatrick_scale:!1,category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],"char":'\ud83c\udf03',fitzpatrick_scale:!1,category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],"char":'\ud83c\udf09',fitzpatrick_scale:!1,category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],"char":'\ud83c\udf0c',fitzpatrick_scale:!1,category:"travel_and_places"},stars:{keywords:["night","photo"],"char":'\ud83c\udf20',fitzpatrick_scale:!1,category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],"char":'\ud83c\udf87',fitzpatrick_scale:!1,category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],"char":'\ud83c\udf86',fitzpatrick_scale:!1,category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn_face","photo","sky","spring"],"char":'\ud83c\udf08',fitzpatrick_scale:!1,category:"travel_and_places"},houses:{keywords:["buildings","photo"],"char":'\ud83c\udfd8',fitzpatrick_scale:!1,category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],"char":'\ud83c\udff0',fitzpatrick_scale:!1,category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],"char":'\ud83c\udfef',fitzpatrick_scale:!1,category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],"char":'\ud83c\udfdf',fitzpatrick_scale:!1,category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],"char":'\ud83d\uddfd',fitzpatrick_scale:!1,category:"travel_and_places"},house:{keywords:["building","home"],"char":'\ud83c\udfe0',fitzpatrick_scale:!1,category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],"char":'\ud83c\udfe1',fitzpatrick_scale:!1,category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],"char":'\ud83c\udfda',fitzpatrick_scale:!1,category:"travel_and_places"},office:{keywords:["building","bureau","work"],"char":'\ud83c\udfe2',fitzpatrick_scale:!1,category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],"char":'\ud83c\udfec',fitzpatrick_scale:!1,category:"travel_and_places"},post_office:{keywords:["building","envelope","communication"],"char":'\ud83c\udfe3',fitzpatrick_scale:!1,category:"travel_and_places"},european_post_office:{keywords:["building","email"],"char":'\ud83c\udfe4',fitzpatrick_scale:!1,category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],"char":'\ud83c\udfe5',fitzpatrick_scale:!1,category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],"char":'\ud83c\udfe6',fitzpatrick_scale:!1,category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],"char":'\ud83c\udfe8',fitzpatrick_scale:!1,category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],"char":'\ud83c\udfea',fitzpatrick_scale:!1,category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],"char":'\ud83c\udfeb',fitzpatrick_scale:!1,category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],"char":'\ud83c\udfe9',fitzpatrick_scale:!1,category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],"char":'\ud83d\udc92',fitzpatrick_scale:!1,category:"travel_and_places"},classical_building:{keywords:["art","culture","history"],"char":'\ud83c\udfdb',fitzpatrick_scale:!1,category:"travel_and_places"},church:{keywords:["building","religion","christ"],"char":'\u26ea',fitzpatrick_scale:!1,category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],"char":'\ud83d\udd4c',fitzpatrick_scale:!1,category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],"char":'\ud83d\udd4d',fitzpatrick_scale:!1,category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],"char":'\ud83d\udd4b',fitzpatrick_scale:!1,category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],"char":'\u26e9',fitzpatrick_scale:!1,category:"travel_and_places"},watch:{keywords:["time","accessories"],"char":'\u231a',fitzpatrick_scale:!1,category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],"char":'\ud83d\udcf1',fitzpatrick_scale:!1,category:"objects"},calling:{keywords:["iphone","incoming"],"char":'\ud83d\udcf2',fitzpatrick_scale:!1,category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],"char":'\ud83d\udcbb',fitzpatrick_scale:!1,category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],"char":'\u2328',fitzpatrick_scale:!1,category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],"char":'\ud83d\udda5',fitzpatrick_scale:!1,category:"objects"},printer:{keywords:["paper","ink"],"char":'\ud83d\udda8',fitzpatrick_scale:!1,category:"objects"},computer_mouse:{keywords:["click"],"char":'\ud83d\uddb1',fitzpatrick_scale:!1,category:"objects"},trackball:{keywords:["technology","trackpad"],"char":'\ud83d\uddb2',fitzpatrick_scale:!1,category:"objects"},joystick:{keywords:["game","play"],"char":'\ud83d\udd79',fitzpatrick_scale:!1,category:"objects"},clamp:{keywords:["tool"],"char":'\ud83d\udddc',fitzpatrick_scale:!1,category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],"char":'\ud83d\udcbd',fitzpatrick_scale:!1,category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],"char":'\ud83d\udcbe',fitzpatrick_scale:!1,category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],"char":'\ud83d\udcbf',fitzpatrick_scale:!1,category:"objects"},dvd:{keywords:["cd","disk","disc"],"char":'\ud83d\udcc0',fitzpatrick_scale:!1,category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],"char":'\ud83d\udcfc',fitzpatrick_scale:!1,category:"objects"},camera:{keywords:["gadgets","photography"],"char":'\ud83d\udcf7',fitzpatrick_scale:!1,category:"objects"},camera_flash:{keywords:["photography","gadgets"],"char":'\ud83d\udcf8',fitzpatrick_scale:!1,category:"objects"},video_camera:{keywords:["film","record"],"char":'\ud83d\udcf9',fitzpatrick_scale:!1,category:"objects"},movie_camera:{keywords:["film","record"],"char":'\ud83c\udfa5',fitzpatrick_scale:!1,category:"objects"},film_projector:{keywords:["video","tape","record","movie"],"char":'\ud83d\udcfd',fitzpatrick_scale:!1,category:"objects"},film_strip:{keywords:["movie"],"char":'\ud83c\udf9e',fitzpatrick_scale:!1,category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],"char":'\ud83d\udcde',fitzpatrick_scale:!1,category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],"char":'\u260e\ufe0f',fitzpatrick_scale:!1,category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],"char":'\ud83d\udcdf',fitzpatrick_scale:!1,category:"objects"},fax:{keywords:["communication","technology"],"char":'\ud83d\udce0',fitzpatrick_scale:!1,category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],"char":'\ud83d\udcfa',fitzpatrick_scale:!1,category:"objects"},radio:{keywords:["communication","music","podcast","program"],"char":'\ud83d\udcfb',fitzpatrick_scale:!1,category:"objects"},studio_microphone:{keywords:["sing","recording","artist","talkshow"],"char":'\ud83c\udf99',fitzpatrick_scale:!1,category:"objects"},level_slider:{keywords:["scale"],"char":'\ud83c\udf9a',fitzpatrick_scale:!1,category:"objects"},control_knobs:{keywords:["dial"],"char":'\ud83c\udf9b',fitzpatrick_scale:!1,category:"objects"},compass:{keywords:["magnetic","navigation","orienteering"],"char":'\ud83e\udded',fitzpatrick_scale:!1,category:"objects"},stopwatch:{keywords:["time","deadline"],"char":'\u23f1',fitzpatrick_scale:!1,category:"objects"},timer_clock:{keywords:["alarm"],"char":'\u23f2',fitzpatrick_scale:!1,category:"objects"},alarm_clock:{keywords:["time","wake"],"char":'\u23f0',fitzpatrick_scale:!1,category:"objects"},mantelpiece_clock:{keywords:["time"],"char":'\ud83d\udd70',fitzpatrick_scale:!1,category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],"char":'\u23f3',fitzpatrick_scale:!1,category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],"char":'\u231b',fitzpatrick_scale:!1,category:"objects"},satellite:{keywords:["communication","future","radio","space"],"char":'\ud83d\udce1',fitzpatrick_scale:!1,category:"objects"},battery:{keywords:["power","energy","sustain"],"char":'\ud83d\udd0b',fitzpatrick_scale:!1,category:"objects"},electric_plug:{keywords:["charger","power"],"char":'\ud83d\udd0c',fitzpatrick_scale:!1,category:"objects"},bulb:{keywords:["light","electricity","idea"],"char":'\ud83d\udca1',fitzpatrick_scale:!1,category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],"char":'\ud83d\udd26',fitzpatrick_scale:!1,category:"objects"},candle:{keywords:["fire","wax"],"char":'\ud83d\udd6f',fitzpatrick_scale:!1,category:"objects"},fire_extinguisher:{keywords:["quench"],"char":'\ud83e\uddef',fitzpatrick_scale:!1,category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],"char":'\ud83d\uddd1',fitzpatrick_scale:!1,category:"objects"},oil_drum:{keywords:["barrell"],"char":'\ud83d\udee2',fitzpatrick_scale:!1,category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],"char":'\ud83d\udcb8',fitzpatrick_scale:!1,category:"objects"},dollar:{keywords:["money","sales","bill","currency"],"char":'\ud83d\udcb5',fitzpatrick_scale:!1,category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],"char":'\ud83d\udcb4',fitzpatrick_scale:!1,category:"objects"},euro:{keywords:["money","sales","dollar","currency"],"char":'\ud83d\udcb6',fitzpatrick_scale:!1,category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],"char":'\ud83d\udcb7',fitzpatrick_scale:!1,category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],"char":'\ud83d\udcb0',fitzpatrick_scale:!1,category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],"char":'\ud83d\udcb3',fitzpatrick_scale:!1,category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],"char":'\ud83d\udc8e',fitzpatrick_scale:!1,category:"objects"},balance_scale:{keywords:["law","fairness","weight"],"char":'\u2696',fitzpatrick_scale:!1,category:"objects"},toolbox:{keywords:["tools","diy","fix","maintainer","mechanic"],"char":'\ud83e\uddf0',fitzpatrick_scale:!1,category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],"char":'\ud83d\udd27',fitzpatrick_scale:!1,category:"objects"},hammer:{keywords:["tools","build","create"],"char":'\ud83d\udd28',fitzpatrick_scale:!1,category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],"char":'\u2692',fitzpatrick_scale:!1,category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],"char":'\ud83d\udee0',fitzpatrick_scale:!1,category:"objects"},pick:{keywords:["tools","dig"],"char":'\u26cf',fitzpatrick_scale:!1,category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],"char":'\ud83d\udd29',fitzpatrick_scale:!1,category:"objects"},gear:{keywords:["cog"],"char":'\u2699',fitzpatrick_scale:!1,category:"objects"},brick:{keywords:["bricks"],"char":'\ud83e\uddf1',fitzpatrick_scale:!1,category:"objects"},chains:{keywords:["lock","arrest"],"char":'\u26d3',fitzpatrick_scale:!1,category:"objects"},magnet:{keywords:["attraction","magnetic"],"char":'\ud83e\uddf2',fitzpatrick_scale:!1,category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],"char":'\ud83d\udd2b',fitzpatrick_scale:!1,category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],"char":'\ud83d\udca3',fitzpatrick_scale:!1,category:"objects"},firecracker:{keywords:["dynamite","boom","explode","explosion","explosive"],"char":'\ud83e\udde8',fitzpatrick_scale:!1,category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],"char":'\ud83d\udd2a',fitzpatrick_scale:!1,category:"objects"},dagger:{keywords:["weapon"],"char":'\ud83d\udde1',fitzpatrick_scale:!1,category:"objects"},crossed_swords:{keywords:["weapon"],"char":'\u2694',fitzpatrick_scale:!1,category:"objects"},shield:{keywords:["protection","security"],"char":'\ud83d\udee1',fitzpatrick_scale:!1,category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],"char":'\ud83d\udeac',fitzpatrick_scale:!1,category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary","death","pirate","evil"],"char":'\u2620',fitzpatrick_scale:!1,category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],"char":'\u26b0',fitzpatrick_scale:!1,category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],"char":'\u26b1',fitzpatrick_scale:!1,category:"objects"},amphora:{keywords:["vase","jar"],"char":'\ud83c\udffa',fitzpatrick_scale:!1,category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],"char":'\ud83d\udd2e',fitzpatrick_scale:!1,category:"objects"},prayer_beads:{keywords:["dhikr","religious"],"char":'\ud83d\udcff',fitzpatrick_scale:!1,category:"objects"},nazar_amulet:{keywords:["bead","charm"],"char":'\ud83e\uddff',fitzpatrick_scale:!1,category:"objects"},barber:{keywords:["hair","salon","style"],"char":'\ud83d\udc88',fitzpatrick_scale:!1,category:"objects"},alembic:{keywords:["distilling","science","experiment","chemistry"],"char":'\u2697',fitzpatrick_scale:!1,category:"objects"},telescope:{keywords:["stars","space","zoom","science","astronomy"],"char":'\ud83d\udd2d',fitzpatrick_scale:!1,category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],"char":'\ud83d\udd2c',fitzpatrick_scale:!1,category:"objects"},hole:{keywords:["embarrassing"],"char":'\ud83d\udd73',fitzpatrick_scale:!1,category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],"char":'\ud83d\udc8a',fitzpatrick_scale:!1,category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],"char":'\ud83d\udc89',fitzpatrick_scale:!1,category:"objects"},dna:{keywords:["biologist","genetics","life"],"char":'\ud83e\uddec',fitzpatrick_scale:!1,category:"objects"},microbe:{keywords:["amoeba","bacteria","germs"],"char":'\ud83e\udda0',fitzpatrick_scale:!1,category:"objects"},petri_dish:{keywords:["bacteria","biology","culture","lab"],"char":'\ud83e\uddeb',fitzpatrick_scale:!1,category:"objects"},test_tube:{keywords:["chemistry","experiment","lab","science"],"char":'\ud83e\uddea',fitzpatrick_scale:!1,category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],"char":'\ud83c\udf21',fitzpatrick_scale:!1,category:"objects"},broom:{keywords:["cleaning","sweeping","witch"],"char":'\ud83e\uddf9',fitzpatrick_scale:!1,category:"objects"},basket:{keywords:["laundry"],"char":'\ud83e\uddfa',fitzpatrick_scale:!1,category:"objects"},toilet_paper:{keywords:["roll"],"char":'\ud83e\uddfb',fitzpatrick_scale:!1,category:"objects"},label:{keywords:["sale","tag"],"char":'\ud83c\udff7',fitzpatrick_scale:!1,category:"objects"},bookmark:{keywords:["favorite","label","save"],"char":'\ud83d\udd16',fitzpatrick_scale:!1,category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],"char":'\ud83d\udebd',fitzpatrick_scale:!1,category:"objects"},shower:{keywords:["clean","water","bathroom"],"char":'\ud83d\udebf',fitzpatrick_scale:!1,category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],"char":'\ud83d\udec1',fitzpatrick_scale:!1,category:"objects"},soap:{keywords:["bar","bathing","cleaning","lather"],"char":'\ud83e\uddfc',fitzpatrick_scale:!1,category:"objects"},sponge:{keywords:["absorbing","cleaning","porous"],"char":'\ud83e\uddfd',fitzpatrick_scale:!1,category:"objects"},lotion_bottle:{keywords:["moisturizer","sunscreen"],"char":'\ud83e\uddf4',fitzpatrick_scale:!1,category:"objects"},key:{keywords:["lock","door","password"],"char":'\ud83d\udd11',fitzpatrick_scale:!1,category:"objects"},old_key:{keywords:["lock","door","password"],"char":'\ud83d\udddd',fitzpatrick_scale:!1,category:"objects"},couch_and_lamp:{keywords:["read","chill"],"char":'\ud83d\udecb',fitzpatrick_scale:!1,category:"objects"},sleeping_bed:{keywords:["bed","rest"],"char":'\ud83d\udecc',fitzpatrick_scale:!0,category:"objects"},bed:{keywords:["sleep","rest"],"char":'\ud83d\udecf',fitzpatrick_scale:!1,category:"objects"},door:{keywords:["house","entry","exit"],"char":'\ud83d\udeaa',fitzpatrick_scale:!1,category:"objects"},bellhop_bell:{keywords:["service"],"char":'\ud83d\udece',fitzpatrick_scale:!1,category:"objects"},teddy_bear:{keywords:["plush","stuffed"],"char":'\ud83e\uddf8',fitzpatrick_scale:!1,category:"objects"},framed_picture:{keywords:["photography"],"char":'\ud83d\uddbc',fitzpatrick_scale:!1,category:"objects"},world_map:{keywords:["location","direction"],"char":'\ud83d\uddfa',fitzpatrick_scale:!1,category:"objects"},parasol_on_ground:{keywords:["weather","summer"],"char":'\u26f1',fitzpatrick_scale:!1,category:"objects"},moyai:{keywords:["rock","easter island","moai"],"char":'\ud83d\uddff',fitzpatrick_scale:!1,category:"objects"},shopping:{keywords:["mall","buy","purchase"],"char":'\ud83d\udecd',fitzpatrick_scale:!1,category:"objects"},shopping_cart:{keywords:["trolley"],"char":'\ud83d\uded2',fitzpatrick_scale:!1,category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],"char":'\ud83c\udf88',fitzpatrick_scale:!1,category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],"char":'\ud83c\udf8f',fitzpatrick_scale:!1,category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],"char":'\ud83c\udf80',fitzpatrick_scale:!1,category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],"char":'\ud83c\udf81',fitzpatrick_scale:!1,category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],"char":'\ud83c\udf8a',fitzpatrick_scale:!1,category:"objects"},tada:{keywords:["party","congratulations","birthday","magic","circus","celebration"],"char":'\ud83c\udf89',fitzpatrick_scale:!1,category:"objects"},dolls:{keywords:["japanese","toy","kimono"],"char":'\ud83c\udf8e',fitzpatrick_scale:!1,category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],"char":'\ud83c\udf90',fitzpatrick_scale:!1,category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],"char":'\ud83c\udf8c',fitzpatrick_scale:!1,category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],"char":'\ud83c\udfee',fitzpatrick_scale:!1,category:"objects"},red_envelope:{keywords:["gift"],"char":'\ud83e\udde7',fitzpatrick_scale:!1,category:"objects"},email:{keywords:["letter","postal","inbox","communication"],"char":'\u2709\ufe0f',fitzpatrick_scale:!1,category:"objects"},envelope_with_arrow:{keywords:["email","communication"],"char":'\ud83d\udce9',fitzpatrick_scale:!1,category:"objects"},incoming_envelope:{keywords:["email","inbox"],"char":'\ud83d\udce8',fitzpatrick_scale:!1,category:"objects"},"e-mail":{keywords:["communication","inbox"],"char":'\ud83d\udce7',fitzpatrick_scale:!1,category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],"char":'\ud83d\udc8c',fitzpatrick_scale:!1,category:"objects"},postbox:{keywords:["email","letter","envelope"],"char":'\ud83d\udcee',fitzpatrick_scale:!1,category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],"char":'\ud83d\udcea',fitzpatrick_scale:!1,category:"objects"},mailbox:{keywords:["email","inbox","communication"],"char":'\ud83d\udceb',fitzpatrick_scale:!1,category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],"char":'\ud83d\udcec',fitzpatrick_scale:!1,category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],"char":'\ud83d\udced',fitzpatrick_scale:!1,category:"objects"},"package":{keywords:["mail","gift","cardboard","box","moving"],"char":'\ud83d\udce6',fitzpatrick_scale:!1,category:"objects"},postal_horn:{keywords:["instrument","music"],"char":'\ud83d\udcef',fitzpatrick_scale:!1,category:"objects"},inbox_tray:{keywords:["email","documents"],"char":'\ud83d\udce5',fitzpatrick_scale:!1,category:"objects"},outbox_tray:{keywords:["inbox","email"],"char":'\ud83d\udce4',fitzpatrick_scale:!1,category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],"char":'\ud83d\udcdc',fitzpatrick_scale:!1,category:"objects"},page_with_curl:{keywords:["documents","office","paper"],"char":'\ud83d\udcc3',fitzpatrick_scale:!1,category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],"char":'\ud83d\udcd1',fitzpatrick_scale:!1,category:"objects"},receipt:{keywords:["accounting","expenses"],"char":'\ud83e\uddfe',fitzpatrick_scale:!1,category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],"char":'\ud83d\udcca',fitzpatrick_scale:!1,category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],"char":'\ud83d\udcc8',fitzpatrick_scale:!1,category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],"char":'\ud83d\udcc9',fitzpatrick_scale:!1,category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],"char":'\ud83d\udcc4',fitzpatrick_scale:!1,category:"objects"},date:{keywords:["calendar","schedule"],"char":'\ud83d\udcc5',fitzpatrick_scale:!1,category:"objects"},calendar:{keywords:["schedule","date","planning"],"char":'\ud83d\udcc6',fitzpatrick_scale:!1,category:"objects"},spiral_calendar:{keywords:["date","schedule","planning"],"char":'\ud83d\uddd3',fitzpatrick_scale:!1,category:"objects"},card_index:{keywords:["business","stationery"],"char":'\ud83d\udcc7',fitzpatrick_scale:!1,category:"objects"},card_file_box:{keywords:["business","stationery"],"char":'\ud83d\uddc3',fitzpatrick_scale:!1,category:"objects"},ballot_box:{keywords:["election","vote"],"char":'\ud83d\uddf3',fitzpatrick_scale:!1,category:"objects"},file_cabinet:{keywords:["filing","organizing"],"char":'\ud83d\uddc4',fitzpatrick_scale:!1,category:"objects"},clipboard:{keywords:["stationery","documents"],"char":'\ud83d\udccb',fitzpatrick_scale:!1,category:"objects"},spiral_notepad:{keywords:["memo","stationery"],"char":'\ud83d\uddd2',fitzpatrick_scale:!1,category:"objects"},file_folder:{keywords:["documents","business","office"],"char":'\ud83d\udcc1',fitzpatrick_scale:!1,category:"objects"},open_file_folder:{keywords:["documents","load"],"char":'\ud83d\udcc2',fitzpatrick_scale:!1,category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],"char":'\ud83d\uddc2',fitzpatrick_scale:!1,category:"objects"},newspaper_roll:{keywords:["press","headline"],"char":'\ud83d\uddde',fitzpatrick_scale:!1,category:"objects"},newspaper:{keywords:["press","headline"],"char":'\ud83d\udcf0',fitzpatrick_scale:!1,category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],"char":'\ud83d\udcd3',fitzpatrick_scale:!1,category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],"char":'\ud83d\udcd5',fitzpatrick_scale:!1,category:"objects"},green_book:{keywords:["read","library","knowledge","study"],"char":'\ud83d\udcd7',fitzpatrick_scale:!1,category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],"char":'\ud83d\udcd8',fitzpatrick_scale:!1,category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],"char":'\ud83d\udcd9',fitzpatrick_scale:!1,category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],"char":'\ud83d\udcd4',fitzpatrick_scale:!1,category:"objects"},ledger:{keywords:["notes","paper"],"char":'\ud83d\udcd2',fitzpatrick_scale:!1,category:"objects"},books:{keywords:["literature","library","study"],"char":'\ud83d\udcda',fitzpatrick_scale:!1,category:"objects"},open_book:{keywords:["book","read","library","knowledge","literature","learn","study"],"char":'\ud83d\udcd6',fitzpatrick_scale:!1,category:"objects"},safety_pin:{keywords:["diaper"],"char":'\ud83e\uddf7',fitzpatrick_scale:!1,category:"objects"},link:{keywords:["rings","url"],"char":'\ud83d\udd17',fitzpatrick_scale:!1,category:"objects"},paperclip:{keywords:["documents","stationery"],"char":'\ud83d\udcce',fitzpatrick_scale:!1,category:"objects"},paperclips:{keywords:["documents","stationery"],"char":'\ud83d\udd87',fitzpatrick_scale:!1,category:"objects"},scissors:{keywords:["stationery","cut"],"char":'\u2702\ufe0f',fitzpatrick_scale:!1,category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],"char":'\ud83d\udcd0',fitzpatrick_scale:!1,category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],"char":'\ud83d\udccf',fitzpatrick_scale:!1,category:"objects"},abacus:{keywords:["calculation"],"char":'\ud83e\uddee',fitzpatrick_scale:!1,category:"objects"},pushpin:{keywords:["stationery","mark","here"],"char":'\ud83d\udccc',fitzpatrick_scale:!1,category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],"char":'\ud83d\udccd',fitzpatrick_scale:!1,category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],"char":'\ud83d\udea9',fitzpatrick_scale:!1,category:"objects"},white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],"char":'\ud83c\udff3',fitzpatrick_scale:!1,category:"objects"},black_flag:{keywords:["pirate"],"char":'\ud83c\udff4',fitzpatrick_scale:!1,category:"objects"},rainbow_flag:{keywords:["flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"],"char":'\ud83c\udff3\ufe0f\u200d\ud83c\udf08',fitzpatrick_scale:!1,category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],"char":'\ud83d\udd10',fitzpatrick_scale:!1,category:"objects"},lock:{keywords:["security","password","padlock"],"char":'\ud83d\udd12',fitzpatrick_scale:!1,category:"objects"},unlock:{keywords:["privacy","security"],"char":'\ud83d\udd13',fitzpatrick_scale:!1,category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],"char":'\ud83d\udd0f',fitzpatrick_scale:!1,category:"objects"},pen:{keywords:["stationery","writing","write"],"char":'\ud83d\udd8a',fitzpatrick_scale:!1,category:"objects"},fountain_pen:{keywords:["stationery","writing","write"],"char":'\ud83d\udd8b',fitzpatrick_scale:!1,category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],"char":'\u2712\ufe0f',fitzpatrick_scale:!1,category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],"char":'\ud83d\udcdd',fitzpatrick_scale:!1,category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],"char":'\u270f\ufe0f',fitzpatrick_scale:!1,category:"objects"},crayon:{keywords:["drawing","creativity"],"char":'\ud83d\udd8d',fitzpatrick_scale:!1,category:"objects"},paintbrush:{keywords:["drawing","creativity","art"],"char":'\ud83d\udd8c',fitzpatrick_scale:!1,category:"objects"},mag:{keywords:["search","zoom","find","detective"],"char":'\ud83d\udd0d',fitzpatrick_scale:!1,category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],"char":'\ud83d\udd0e',fitzpatrick_scale:!1,category:"objects"},heart:{keywords:["love","like","valentines"],"char":'\u2764\ufe0f',fitzpatrick_scale:!1,category:"symbols"},orange_heart:{keywords:["love","like","affection","valentines"],"char":'\ud83e\udde1',fitzpatrick_scale:!1,category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],"char":'\ud83d\udc9b',fitzpatrick_scale:!1,category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],"char":'\ud83d\udc9a',fitzpatrick_scale:!1,category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],"char":'\ud83d\udc99',fitzpatrick_scale:!1,category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],"char":'\ud83d\udc9c',fitzpatrick_scale:!1,category:"symbols"},black_heart:{keywords:["evil"],"char":'\ud83d\udda4',fitzpatrick_scale:!1,category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],"char":'\ud83d\udc94',fitzpatrick_scale:!1,category:"symbols"},heavy_heart_exclamation:{keywords:["decoration","love"],"char":'\u2763',fitzpatrick_scale:!1,category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],"char":'\ud83d\udc95',fitzpatrick_scale:!1,category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],"char":'\ud83d\udc9e',fitzpatrick_scale:!1,category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],"char":'\ud83d\udc93',fitzpatrick_scale:!1,category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],"char":'\ud83d\udc97',fitzpatrick_scale:!1,category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],"char":'\ud83d\udc96',fitzpatrick_scale:!1,category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],"char":'\ud83d\udc98',fitzpatrick_scale:!1,category:"symbols"},gift_heart:{keywords:["love","valentines"],"char":'\ud83d\udc9d',fitzpatrick_scale:!1,category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],"char":'\ud83d\udc9f',fitzpatrick_scale:!1,category:"symbols"},peace_symbol:{keywords:["hippie"],"char":'\u262e',fitzpatrick_scale:!1,category:"symbols"},latin_cross:{keywords:["christianity"],"char":'\u271d',fitzpatrick_scale:!1,category:"symbols"},star_and_crescent:{keywords:["islam"],"char":'\u262a',fitzpatrick_scale:!1,category:"symbols"},om:{keywords:["hinduism","buddhism","sikhism","jainism"],"char":'\ud83d\udd49',fitzpatrick_scale:!1,category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],"char":'\u2638',fitzpatrick_scale:!1,category:"symbols"},star_of_david:{keywords:["judaism"],"char":'\u2721',fitzpatrick_scale:!1,category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],"char":'\ud83d\udd2f',fitzpatrick_scale:!1,category:"symbols"},menorah:{keywords:["hanukkah","candles","jewish"],"char":'\ud83d\udd4e',fitzpatrick_scale:!1,category:"symbols"},yin_yang:{keywords:["balance"],"char":'\u262f',fitzpatrick_scale:!1,category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],"char":'\u2626',fitzpatrick_scale:!1,category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],"char":'\ud83d\uded0',fitzpatrick_scale:!1,category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],"char":'\u26ce',fitzpatrick_scale:!1,category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],"char":'\u2648',fitzpatrick_scale:!1,category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],"char":'\u2649',fitzpatrick_scale:!1,category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],"char":'\u264a',fitzpatrick_scale:!1,category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],"char":'\u264b',fitzpatrick_scale:!1,category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],"char":'\u264c',fitzpatrick_scale:!1,category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],"char":'\u264d',fitzpatrick_scale:!1,category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],"char":'\u264e',fitzpatrick_scale:!1,category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],"char":'\u264f',fitzpatrick_scale:!1,category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],"char":'\u2650',fitzpatrick_scale:!1,category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],"char":'\u2651',fitzpatrick_scale:!1,category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],"char":'\u2652',fitzpatrick_scale:!1,category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],"char":'\u2653',fitzpatrick_scale:!1,category:"symbols"},id:{keywords:["purple-square","words"],"char":'\ud83c\udd94',fitzpatrick_scale:!1,category:"symbols"},atom_symbol:{keywords:["science","physics","chemistry"],"char":'\u269b',fitzpatrick_scale:!1,category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],"char":'\ud83c\ude33',fitzpatrick_scale:!1,category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],"char":'\ud83c\ude39',fitzpatrick_scale:!1,category:"symbols"},radioactive:{keywords:["nuclear","danger"],"char":'\u2622',fitzpatrick_scale:!1,category:"symbols"},biohazard:{keywords:["danger"],"char":'\u2623',fitzpatrick_scale:!1,category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],"char":'\ud83d\udcf4',fitzpatrick_scale:!1,category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],"char":'\ud83d\udcf3',fitzpatrick_scale:!1,category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],"char":'\ud83c\ude36',fitzpatrick_scale:!1,category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],"char":'\ud83c\ude1a',fitzpatrick_scale:!1,category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],"char":'\ud83c\ude38',fitzpatrick_scale:!1,category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],"char":'\ud83c\ude3a',fitzpatrick_scale:!1,category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],"char":'\ud83c\ude37\ufe0f',fitzpatrick_scale:!1,category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],"char":'\u2734\ufe0f',fitzpatrick_scale:!1,category:"symbols"},vs:{keywords:["words","orange-square"],"char":'\ud83c\udd9a',fitzpatrick_scale:!1,category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],"char":'\ud83c\ude51',fitzpatrick_scale:!1,category:"symbols"},white_flower:{keywords:["japanese","spring"],"char":'\ud83d\udcae',fitzpatrick_scale:!1,category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],"char":'\ud83c\ude50',fitzpatrick_scale:!1,category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],"char":'\u3299\ufe0f',fitzpatrick_scale:!1,category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],"char":'\u3297\ufe0f',fitzpatrick_scale:!1,category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],"char":'\ud83c\ude34',fitzpatrick_scale:!1,category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],"char":'\ud83c\ude35',fitzpatrick_scale:!1,category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],"char":'\ud83c\ude32',fitzpatrick_scale:!1,category:"symbols"},a:{keywords:["red-square","alphabet","letter"],"char":'\ud83c\udd70\ufe0f',fitzpatrick_scale:!1,category:"symbols"},b:{keywords:["red-square","alphabet","letter"],"char":'\ud83c\udd71\ufe0f',fitzpatrick_scale:!1,category:"symbols"},ab:{keywords:["red-square","alphabet"],"char":'\ud83c\udd8e',fitzpatrick_scale:!1,category:"symbols"},cl:{keywords:["alphabet","words","red-square"],"char":'\ud83c\udd91',fitzpatrick_scale:!1,category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],"char":'\ud83c\udd7e\ufe0f',fitzpatrick_scale:!1,category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],"char":'\ud83c\udd98',fitzpatrick_scale:!1,category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],"char":'\u26d4',fitzpatrick_scale:!1,category:"symbols"},name_badge:{keywords:["fire","forbid"],"char":'\ud83d\udcdb',fitzpatrick_scale:!1,category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],"char":'\ud83d\udeab',fitzpatrick_scale:!1,category:"symbols"},x:{keywords:["no","delete","remove","cancel","red"],"char":'\u274c',fitzpatrick_scale:!1,category:"symbols"},o:{keywords:["circle","round"],"char":'\u2b55',fitzpatrick_scale:!1,category:"symbols"},stop_sign:{keywords:["stop"],"char":'\ud83d\uded1',fitzpatrick_scale:!1,category:"symbols"},anger:{keywords:["angry","mad"],"char":'\ud83d\udca2',fitzpatrick_scale:!1,category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],"char":'\u2668\ufe0f',fitzpatrick_scale:!1,category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],"char":'\ud83d\udeb7',fitzpatrick_scale:!1,category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],"char":'\ud83d\udeaf',fitzpatrick_scale:!1,category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],"char":'\ud83d\udeb3',fitzpatrick_scale:!1,category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],"char":'\ud83d\udeb1',fitzpatrick_scale:!1,category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],"char":'\ud83d\udd1e',fitzpatrick_scale:!1,category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],"char":'\ud83d\udcf5',fitzpatrick_scale:!1,category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],"char":'\u2757',fitzpatrick_scale:!1,category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],"char":'\u2755',fitzpatrick_scale:!1,category:"symbols"},question:{keywords:["doubt","confused"],"char":'\u2753',fitzpatrick_scale:!1,category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],"char":'\u2754',fitzpatrick_scale:!1,category:"symbols"},bangbang:{keywords:["exclamation","surprise"],"char":'\u203c\ufe0f',fitzpatrick_scale:!1,category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],"char":'\u2049\ufe0f',fitzpatrick_scale:!1,category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],"char":'\ud83d\udd05',fitzpatrick_scale:!1,category:"symbols"},high_brightness:{keywords:["sun","light"],"char":'\ud83d\udd06',fitzpatrick_scale:!1,category:"symbols"},trident:{keywords:["weapon","spear"],"char":'\ud83d\udd31',fitzpatrick_scale:!1,category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],"char":'\u269c',fitzpatrick_scale:!1,category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],"char":'\u303d\ufe0f',fitzpatrick_scale:!1,category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],"char":'\u26a0\ufe0f',fitzpatrick_scale:!1,category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],"char":'\ud83d\udeb8',fitzpatrick_scale:!1,category:"symbols"},beginner:{keywords:["badge","shield"],"char":'\ud83d\udd30',fitzpatrick_scale:!1,category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],"char":'\u267b\ufe0f',fitzpatrick_scale:!1,category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],"char":'\ud83c\ude2f',fitzpatrick_scale:!1,category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],"char":'\ud83d\udcb9',fitzpatrick_scale:!1,category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],"char":'\u2747\ufe0f',fitzpatrick_scale:!1,category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],"char":'\u2733\ufe0f',fitzpatrick_scale:!1,category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],"char":'\u274e',fitzpatrick_scale:!1,category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer","tick"],"char":'\u2705',fitzpatrick_scale:!1,category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],"char":'\ud83d\udca0',fitzpatrick_scale:!1,category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],"char":'\ud83c\udf00',fitzpatrick_scale:!1,category:"symbols"},loop:{keywords:["tape","cassette"],"char":'\u27bf',fitzpatrick_scale:!1,category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],"char":'\ud83c\udf10',fitzpatrick_scale:!1,category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],"char":'\u24c2\ufe0f',fitzpatrick_scale:!1,category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],"char":'\ud83c\udfe7',fitzpatrick_scale:!1,category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],"char":'\ud83c\ude02\ufe0f',fitzpatrick_scale:!1,category:"symbols"},passport_control:{keywords:["custom","blue-square"],"char":'\ud83d\udec2',fitzpatrick_scale:!1,category:"symbols"},customs:{keywords:["passport","border","blue-square"],"char":'\ud83d\udec3',fitzpatrick_scale:!1,category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],"char":'\ud83d\udec4',fitzpatrick_scale:!1,category:"symbols"},left_luggage:{keywords:["blue-square","travel"],"char":'\ud83d\udec5',fitzpatrick_scale:!1,category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],"char":'\u267f',fitzpatrick_scale:!1,category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],"char":'\ud83d\udead',fitzpatrick_scale:!1,category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],"char":'\ud83d\udebe',fitzpatrick_scale:!1,category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],"char":'\ud83c\udd7f\ufe0f',fitzpatrick_scale:!1,category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],"char":'\ud83d\udeb0',fitzpatrick_scale:!1,category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],"char":'\ud83d\udeb9',fitzpatrick_scale:!1,category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],"char":'\ud83d\udeba',fitzpatrick_scale:!1,category:"symbols"},baby_symbol:{keywords:["orange-square","child"],"char":'\ud83d\udebc',fitzpatrick_scale:!1,category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],"char":'\ud83d\udebb',fitzpatrick_scale:!1,category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],"char":'\ud83d\udeae',fitzpatrick_scale:!1,category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],"char":'\ud83c\udfa6',fitzpatrick_scale:!1,category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],"char":'\ud83d\udcf6',fitzpatrick_scale:!1,category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],"char":'\ud83c\ude01',fitzpatrick_scale:!1,category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],"char":'\ud83c\udd96',fitzpatrick_scale:!1,category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],"char":'\ud83c\udd97',fitzpatrick_scale:!1,category:"symbols"},up:{keywords:["blue-square","above","high"],"char":'\ud83c\udd99',fitzpatrick_scale:!1,category:"symbols"},cool:{keywords:["words","blue-square"],"char":'\ud83c\udd92',fitzpatrick_scale:!1,category:"symbols"},"new":{keywords:["blue-square","words","start"],"char":'\ud83c\udd95',fitzpatrick_scale:!1,category:"symbols"},free:{keywords:["blue-square","words"],"char":'\ud83c\udd93',fitzpatrick_scale:!1,category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],"char":'0\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},one:{keywords:["blue-square","numbers","1"],"char":'1\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],"char":'2\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],"char":'3\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},four:{keywords:["4","numbers","blue-square"],"char":'4\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],"char":'5\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},six:{keywords:["6","numbers","blue-square"],"char":'6\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],"char":'7\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},eight:{keywords:["8","blue-square","numbers"],"char":'8\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},nine:{keywords:["blue-square","numbers","9"],"char":'9\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],"char":'\ud83d\udd1f',fitzpatrick_scale:!1,category:"symbols"},asterisk:{keywords:["star","keycap"],"char":'*\u20e3',fitzpatrick_scale:!1,category:"symbols"},eject_button:{keywords:["blue-square"],"char":'\u23cf\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],"char":'\u25b6\ufe0f',fitzpatrick_scale:!1,category:"symbols"},pause_button:{keywords:["pause","blue-square"],"char":'\u23f8',fitzpatrick_scale:!1,category:"symbols"},next_track_button:{keywords:["forward","next","blue-square"],"char":'\u23ed',fitzpatrick_scale:!1,category:"symbols"},stop_button:{keywords:["blue-square"],"char":'\u23f9',fitzpatrick_scale:!1,category:"symbols"},record_button:{keywords:["blue-square"],"char":'\u23fa',fitzpatrick_scale:!1,category:"symbols"},play_or_pause_button:{keywords:["blue-square","play","pause"],"char":'\u23ef',fitzpatrick_scale:!1,category:"symbols"},previous_track_button:{keywords:["backward"],"char":'\u23ee',fitzpatrick_scale:!1,category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],"char":'\u23e9',fitzpatrick_scale:!1,category:"symbols"},rewind:{keywords:["play","blue-square"],"char":'\u23ea',fitzpatrick_scale:!1,category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],"char":'\ud83d\udd00',fitzpatrick_scale:!1,category:"symbols"},repeat:{keywords:["loop","record"],"char":'\ud83d\udd01',fitzpatrick_scale:!1,category:"symbols"},repeat_one:{keywords:["blue-square","loop"],"char":'\ud83d\udd02',fitzpatrick_scale:!1,category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],"char":'\u25c0\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],"char":'\ud83d\udd3c',fitzpatrick_scale:!1,category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],"char":'\ud83d\udd3d',fitzpatrick_scale:!1,category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],"char":'\u23eb',fitzpatrick_scale:!1,category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],"char":'\u23ec',fitzpatrick_scale:!1,category:"symbols"},arrow_right:{keywords:["blue-square","next"],"char":'\u27a1\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],"char":'\u2b05\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],"char":'\u2b06\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],"char":'\u2b07\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],"char":'\u2197\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],"char":'\u2198\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],"char":'\u2199\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],"char":'\u2196\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],"char":'\u2195\ufe0f',fitzpatrick_scale:!1,category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],"char":'\u2194\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],"char":'\ud83d\udd04',fitzpatrick_scale:!1,category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],"char":'\u21aa\ufe0f',fitzpatrick_scale:!1,category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],"char":'\u21a9\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],"char":'\u2934\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],"char":'\u2935\ufe0f',fitzpatrick_scale:!1,category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],"char":'#\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],"char":'\u2139\ufe0f',fitzpatrick_scale:!1,category:"symbols"},abc:{keywords:["blue-square","alphabet"],"char":'\ud83d\udd24',fitzpatrick_scale:!1,category:"symbols"},abcd:{keywords:["blue-square","alphabet"],"char":'\ud83d\udd21',fitzpatrick_scale:!1,category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],"char":'\ud83d\udd20',fitzpatrick_scale:!1,category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],"char":'\ud83d\udd23',fitzpatrick_scale:!1,category:"symbols"},musical_note:{keywords:["score","tone","sound"],"char":'\ud83c\udfb5',fitzpatrick_scale:!1,category:"symbols"},notes:{keywords:["music","score"],"char":'\ud83c\udfb6',fitzpatrick_scale:!1,category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],"char":'\u3030\ufe0f',fitzpatrick_scale:!1,category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],"char":'\u27b0',fitzpatrick_scale:!1,category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],"char":'\u2714\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],"char":'\ud83d\udd03',fitzpatrick_scale:!1,category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],"char":'\u2795',fitzpatrick_scale:!1,category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],"char":'\u2796',fitzpatrick_scale:!1,category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],"char":'\u2797',fitzpatrick_scale:!1,category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],"char":'\u2716\ufe0f',fitzpatrick_scale:!1,category:"symbols"},infinity:{keywords:["forever"],"char":'\u267e',fitzpatrick_scale:!1,category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],"char":'\ud83d\udcb2',fitzpatrick_scale:!1,category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],"char":'\ud83d\udcb1',fitzpatrick_scale:!1,category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],"char":'\xa9\ufe0f',fitzpatrick_scale:!1,category:"symbols"},registered:{keywords:["alphabet","circle"],"char":'\xae\ufe0f',fitzpatrick_scale:!1,category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],"char":'\u2122\ufe0f',fitzpatrick_scale:!1,category:"symbols"},end:{keywords:["words","arrow"],"char":'\ud83d\udd1a',fitzpatrick_scale:!1,category:"symbols"},back:{keywords:["arrow","words","return"],"char":'\ud83d\udd19',fitzpatrick_scale:!1,category:"symbols"},on:{keywords:["arrow","words"],"char":'\ud83d\udd1b',fitzpatrick_scale:!1,category:"symbols"},top:{keywords:["words","blue-square"],"char":'\ud83d\udd1d',fitzpatrick_scale:!1,category:"symbols"},soon:{keywords:["arrow","words"],"char":'\ud83d\udd1c',fitzpatrick_scale:!1,category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes","tick"],"char":'\u2611\ufe0f',fitzpatrick_scale:!1,category:"symbols"},radio_button:{keywords:["input","old","music","circle"],"char":'\ud83d\udd18',fitzpatrick_scale:!1,category:"symbols"},white_circle:{keywords:["shape","round"],"char":'\u26aa',fitzpatrick_scale:!1,category:"symbols"},black_circle:{keywords:["shape","button","round"],"char":'\u26ab',fitzpatrick_scale:!1,category:"symbols"},red_circle:{keywords:["shape","error","danger"],"char":'\ud83d\udd34',fitzpatrick_scale:!1,category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],"char":'\ud83d\udd35',fitzpatrick_scale:!1,category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],"char":'\ud83d\udd38',fitzpatrick_scale:!1,category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],"char":'\ud83d\udd39',fitzpatrick_scale:!1,category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],"char":'\ud83d\udd36',fitzpatrick_scale:!1,category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],"char":'\ud83d\udd37',fitzpatrick_scale:!1,category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],"char":'\ud83d\udd3a',fitzpatrick_scale:!1,category:"symbols"},black_small_square:{keywords:["shape","icon"],"char":'\u25aa\ufe0f',fitzpatrick_scale:!1,category:"symbols"},white_small_square:{keywords:["shape","icon"],"char":'\u25ab\ufe0f',fitzpatrick_scale:!1,category:"symbols"},black_large_square:{keywords:["shape","icon","button"],"char":'\u2b1b',fitzpatrick_scale:!1,category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],"char":'\u2b1c',fitzpatrick_scale:!1,category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],"char":'\ud83d\udd3b',fitzpatrick_scale:!1,category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],"char":'\u25fc\ufe0f',fitzpatrick_scale:!1,category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],"char":'\u25fb\ufe0f',fitzpatrick_scale:!1,category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],"char":'\u25fe',fitzpatrick_scale:!1,category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],"char":'\u25fd',fitzpatrick_scale:!1,category:"symbols"},black_square_button:{keywords:["shape","input","frame"],"char":'\ud83d\udd32',fitzpatrick_scale:!1,category:"symbols"},white_square_button:{keywords:["shape","input"],"char":'\ud83d\udd33',fitzpatrick_scale:!1,category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],"char":'\ud83d\udd08',fitzpatrick_scale:!1,category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],"char":'\ud83d\udd09',fitzpatrick_scale:!1,category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],"char":'\ud83d\udd0a',fitzpatrick_scale:!1,category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],"char":'\ud83d\udd07',fitzpatrick_scale:!1,category:"symbols"},mega:{keywords:["sound","speaker","volume"],"char":'\ud83d\udce3',fitzpatrick_scale:!1,category:"symbols"},loudspeaker:{keywords:["volume","sound"],"char":'\ud83d\udce2',fitzpatrick_scale:!1,category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],"char":'\ud83d\udd14',fitzpatrick_scale:!1,category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],"char":'\ud83d\udd15',fitzpatrick_scale:!1,category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],"char":'\ud83c\udccf',fitzpatrick_scale:!1,category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],"char":'\ud83c\udc04',fitzpatrick_scale:!1,category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],"char":'\u2660\ufe0f',fitzpatrick_scale:!1,category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],"char":'\u2663\ufe0f',fitzpatrick_scale:!1,category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],"char":'\u2665\ufe0f',fitzpatrick_scale:!1,category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],"char":'\u2666\ufe0f',fitzpatrick_scale:!1,category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],"char":'\ud83c\udfb4',fitzpatrick_scale:!1,category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking","dream"],"char":'\ud83d\udcad',fitzpatrick_scale:!1,category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],"char":'\ud83d\uddef',fitzpatrick_scale:!1,category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],"char":'\ud83d\udcac',fitzpatrick_scale:!1,category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],"char":'\ud83d\udde8',fitzpatrick_scale:!1,category:"symbols"},clock1:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd50',fitzpatrick_scale:!1,category:"symbols"},clock2:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd51',fitzpatrick_scale:!1,category:"symbols"},clock3:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd52',fitzpatrick_scale:!1,category:"symbols"},clock4:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd53',fitzpatrick_scale:!1,category:"symbols"},clock5:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd54',fitzpatrick_scale:!1,category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],"char":'\ud83d\udd55',fitzpatrick_scale:!1,category:"symbols"},clock7:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd56',fitzpatrick_scale:!1,category:"symbols"},clock8:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd57',fitzpatrick_scale:!1,category:"symbols"},clock9:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd58',fitzpatrick_scale:!1,category:"symbols"},clock10:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd59',fitzpatrick_scale:!1,category:"symbols"},clock11:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd5a',fitzpatrick_scale:!1,category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],"char":'\ud83d\udd5b',fitzpatrick_scale:!1,category:"symbols"},clock130:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd5c',fitzpatrick_scale:!1,category:"symbols"},clock230:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd5d',fitzpatrick_scale:!1,category:"symbols"},clock330:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd5e',fitzpatrick_scale:!1,category:"symbols"},clock430:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd5f',fitzpatrick_scale:!1,category:"symbols"},clock530:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd60',fitzpatrick_scale:!1,category:"symbols"},clock630:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd61',fitzpatrick_scale:!1,category:"symbols"},clock730:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd62',fitzpatrick_scale:!1,category:"symbols"},clock830:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd63',fitzpatrick_scale:!1,category:"symbols"},clock930:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd64',fitzpatrick_scale:!1,category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd65',fitzpatrick_scale:!1,category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd66',fitzpatrick_scale:!1,category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],"char":'\ud83d\udd67',fitzpatrick_scale:!1,category:"symbols"},afghanistan:{keywords:["af","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},aland_islands:{keywords:["\xc5land","islands","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddfd',fitzpatrick_scale:!1,category:"flags"},albania:{keywords:["al","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},algeria:{keywords:["dz","flag","nation","country","banner"],"char":'\ud83c\udde9\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},american_samoa:{keywords:["american","ws","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},andorra:{keywords:["ad","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},angola:{keywords:["ao","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},anguilla:{keywords:["ai","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},antarctica:{keywords:["aq","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},antigua_barbuda:{keywords:["antigua","barbuda","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},argentina:{keywords:["ar","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},armenia:{keywords:["am","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},aruba:{keywords:["aw","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},australia:{keywords:["au","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},austria:{keywords:["at","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},azerbaijan:{keywords:["az","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},bahamas:{keywords:["bs","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},bahrain:{keywords:["bh","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},bangladesh:{keywords:["bd","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},barbados:{keywords:["bb","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\udde7',fitzpatrick_scale:!1,category:"flags"},belarus:{keywords:["by","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},belgium:{keywords:["be","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},belize:{keywords:["bz","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},benin:{keywords:["bj","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddef',fitzpatrick_scale:!1,category:"flags"},bermuda:{keywords:["bm","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},bhutan:{keywords:["bt","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},bolivia:{keywords:["bo","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},caribbean_netherlands:{keywords:["bonaire","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},bosnia_herzegovina:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},botswana:{keywords:["bw","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},brazil:{keywords:["br","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},british_indian_ocean_territory:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},british_virgin_islands:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],"char":'\ud83c\uddfb\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},brunei:{keywords:["bn","darussalam","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},bulgaria:{keywords:["bg","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},burkina_faso:{keywords:["burkina","faso","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},burundi:{keywords:["bi","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},cape_verde:{keywords:["cabo","verde","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},cambodia:{keywords:["kh","flag","nation","country","banner"],"char":'\ud83c\uddf0\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},cameroon:{keywords:["cm","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},canada:{keywords:["ca","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},canary_islands:{keywords:["canary","islands","flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},cayman_islands:{keywords:["cayman","islands","flag","nation","country","banner"],"char":'\ud83c\uddf0\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},central_african_republic:{keywords:["central","african","republic","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},chad:{keywords:["td","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},chile:{keywords:["flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],"char":'\ud83c\udde8\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},christmas_island:{keywords:["christmas","island","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddfd',fitzpatrick_scale:!1,category:"flags"},cocos_islands:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},colombia:{keywords:["co","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},comoros:{keywords:["km","flag","nation","country","banner"],"char":'\ud83c\uddf0\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},congo_brazzaville:{keywords:["congo","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},congo_kinshasa:{keywords:["congo","democratic","republic","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},cook_islands:{keywords:["cook","islands","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},costa_rica:{keywords:["costa","rica","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},croatia:{keywords:["hr","flag","nation","country","banner"],"char":'\ud83c\udded\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},cuba:{keywords:["cu","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},curacao:{keywords:["cura\xe7ao","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},cyprus:{keywords:["cy","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},czech_republic:{keywords:["cz","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},denmark:{keywords:["dk","flag","nation","country","banner"],"char":'\ud83c\udde9\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},djibouti:{keywords:["dj","flag","nation","country","banner"],"char":'\ud83c\udde9\ud83c\uddef',fitzpatrick_scale:!1,category:"flags"},dominica:{keywords:["dm","flag","nation","country","banner"],"char":'\ud83c\udde9\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},dominican_republic:{keywords:["dominican","republic","flag","nation","country","banner"],"char":'\ud83c\udde9\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},ecuador:{keywords:["ec","flag","nation","country","banner"],"char":'\ud83c\uddea\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},egypt:{keywords:["eg","flag","nation","country","banner"],"char":'\ud83c\uddea\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},el_salvador:{keywords:["el","salvador","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},equatorial_guinea:{keywords:["equatorial","gn","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},eritrea:{keywords:["er","flag","nation","country","banner"],"char":'\ud83c\uddea\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},estonia:{keywords:["ee","flag","nation","country","banner"],"char":'\ud83c\uddea\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},ethiopia:{keywords:["et","flag","nation","country","banner"],"char":'\ud83c\uddea\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},eu:{keywords:["european","union","flag","banner"],"char":'\ud83c\uddea\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},falkland_islands:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],"char":'\ud83c\uddeb\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},faroe_islands:{keywords:["faroe","islands","flag","nation","country","banner"],"char":'\ud83c\uddeb\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},fiji:{keywords:["fj","flag","nation","country","banner"],"char":'\ud83c\uddeb\ud83c\uddef',fitzpatrick_scale:!1,category:"flags"},finland:{keywords:["fi","flag","nation","country","banner"],"char":'\ud83c\uddeb\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],"char":'\ud83c\uddeb\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},french_guiana:{keywords:["french","guiana","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},french_polynesia:{keywords:["french","polynesia","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},french_southern_territories:{keywords:["french","southern","territories","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},gabon:{keywords:["ga","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},gambia:{keywords:["gm","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},georgia:{keywords:["ge","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},de:{keywords:["german","nation","flag","country","banner"],"char":'\ud83c\udde9\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},ghana:{keywords:["gh","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},gibraltar:{keywords:["gi","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},greece:{keywords:["gr","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},greenland:{keywords:["gl","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},grenada:{keywords:["gd","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},guadeloupe:{keywords:["gp","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},guam:{keywords:["gu","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},guatemala:{keywords:["gt","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},guernsey:{keywords:["gg","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},guinea:{keywords:["gn","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},guinea_bissau:{keywords:["gw","bissau","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},guyana:{keywords:["gy","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},haiti:{keywords:["ht","flag","nation","country","banner"],"char":'\ud83c\udded\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},honduras:{keywords:["hn","flag","nation","country","banner"],"char":'\ud83c\udded\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},hong_kong:{keywords:["hong","kong","flag","nation","country","banner"],"char":'\ud83c\udded\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},hungary:{keywords:["hu","flag","nation","country","banner"],"char":'\ud83c\udded\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},iceland:{keywords:["is","flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},india:{keywords:["in","flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},iran:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},iraq:{keywords:["iq","flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},ireland:{keywords:["ie","flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},isle_of_man:{keywords:["isle","man","flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},israel:{keywords:["il","flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],"char":'\ud83c\uddee\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},cote_divoire:{keywords:["ivory","coast","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},jamaica:{keywords:["jm","flag","nation","country","banner"],"char":'\ud83c\uddef\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],"char":'\ud83c\uddef\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},jersey:{keywords:["je","flag","nation","country","banner"],"char":'\ud83c\uddef\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},jordan:{keywords:["jo","flag","nation","country","banner"],"char":'\ud83c\uddef\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},kazakhstan:{keywords:["kz","flag","nation","country","banner"],"char":'\ud83c\uddf0\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},kenya:{keywords:["ke","flag","nation","country","banner"],"char":'\ud83c\uddf0\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},kiribati:{keywords:["ki","flag","nation","country","banner"],"char":'\ud83c\uddf0\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},kosovo:{keywords:["xk","flag","nation","country","banner"],"char":'\ud83c\uddfd\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},kuwait:{keywords:["kw","flag","nation","country","banner"],"char":'\ud83c\uddf0\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},kyrgyzstan:{keywords:["kg","flag","nation","country","banner"],"char":'\ud83c\uddf0\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},laos:{keywords:["lao","democratic","republic","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},latvia:{keywords:["lv","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},lebanon:{keywords:["lb","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\udde7',fitzpatrick_scale:!1,category:"flags"},lesotho:{keywords:["ls","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},liberia:{keywords:["lr","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},libya:{keywords:["ly","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},liechtenstein:{keywords:["li","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},lithuania:{keywords:["lt","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},luxembourg:{keywords:["lu","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},macau:{keywords:["macao","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},macedonia:{keywords:["macedonia,","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},madagascar:{keywords:["mg","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},malawi:{keywords:["mw","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},malaysia:{keywords:["my","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},maldives:{keywords:["mv","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},mali:{keywords:["ml","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},malta:{keywords:["mt","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},marshall_islands:{keywords:["marshall","islands","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},martinique:{keywords:["mq","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},mauritania:{keywords:["mr","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},mauritius:{keywords:["mu","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},mayotte:{keywords:["yt","flag","nation","country","banner"],"char":'\ud83c\uddfe\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},mexico:{keywords:["mx","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddfd',fitzpatrick_scale:!1,category:"flags"},micronesia:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],"char":'\ud83c\uddeb\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},moldova:{keywords:["moldova,","republic","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},monaco:{keywords:["mc","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},mongolia:{keywords:["mn","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},montenegro:{keywords:["me","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},montserrat:{keywords:["ms","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},morocco:{keywords:["ma","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},mozambique:{keywords:["mz","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},myanmar:{keywords:["mm","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},namibia:{keywords:["na","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},nauru:{keywords:["nr","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},nepal:{keywords:["np","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},netherlands:{keywords:["nl","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},new_caledonia:{keywords:["new","caledonia","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},new_zealand:{keywords:["new","zealand","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},nicaragua:{keywords:["ni","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},niger:{keywords:["ne","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},niue:{keywords:["nu","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},norfolk_island:{keywords:["norfolk","island","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},northern_mariana_islands:{keywords:["northern","mariana","islands","flag","nation","country","banner"],"char":'\ud83c\uddf2\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},north_korea:{keywords:["north","korea","nation","flag","country","banner"],"char":'\ud83c\uddf0\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},norway:{keywords:["no","flag","nation","country","banner"],"char":'\ud83c\uddf3\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},oman:{keywords:["om_symbol","flag","nation","country","banner"],"char":'\ud83c\uddf4\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},pakistan:{keywords:["pk","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},palau:{keywords:["pw","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},palestinian_territories:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},panama:{keywords:["pa","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},papua_new_guinea:{keywords:["papua","new","guinea","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},paraguay:{keywords:["py","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},peru:{keywords:["pe","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},philippines:{keywords:["ph","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},pitcairn_islands:{keywords:["pitcairn","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},poland:{keywords:["pl","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},portugal:{keywords:["pt","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},puerto_rico:{keywords:["puerto","rico","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},qatar:{keywords:["qa","flag","nation","country","banner"],"char":'\ud83c\uddf6\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},reunion:{keywords:["r\xe9union","flag","nation","country","banner"],"char":'\ud83c\uddf7\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},romania:{keywords:["ro","flag","nation","country","banner"],"char":'\ud83c\uddf7\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],"char":'\ud83c\uddf7\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},rwanda:{keywords:["rw","flag","nation","country","banner"],"char":'\ud83c\uddf7\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},st_barthelemy:{keywords:["saint","barth\xe9lemy","flag","nation","country","banner"],"char":'\ud83c\udde7\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},st_helena:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},st_kitts_nevis:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],"char":'\ud83c\uddf0\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},st_lucia:{keywords:["saint","lucia","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},st_pierre_miquelon:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],"char":'\ud83c\uddf5\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},st_vincent_grenadines:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],"char":'\ud83c\uddfb\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},samoa:{keywords:["ws","flag","nation","country","banner"],"char":'\ud83c\uddfc\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},san_marino:{keywords:["san","marino","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},sao_tome_principe:{keywords:["sao","tome","principe","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},senegal:{keywords:["sn","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},serbia:{keywords:["rs","flag","nation","country","banner"],"char":'\ud83c\uddf7\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},seychelles:{keywords:["sc","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},sierra_leone:{keywords:["sierra","leone","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},singapore:{keywords:["sg","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},sint_maarten:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddfd',fitzpatrick_scale:!1,category:"flags"},slovakia:{keywords:["sk","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},slovenia:{keywords:["si","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},solomon_islands:{keywords:["solomon","islands","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\udde7',fitzpatrick_scale:!1,category:"flags"},somalia:{keywords:["so","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},south_africa:{keywords:["south","africa","flag","nation","country","banner"],"char":'\ud83c\uddff\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},south_georgia_south_sandwich_islands:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],"char":'\ud83c\uddec\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],"char":'\ud83c\uddf0\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},south_sudan:{keywords:["south","sd","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],"char":'\ud83c\uddea\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},sri_lanka:{keywords:["sri","lanka","flag","nation","country","banner"],"char":'\ud83c\uddf1\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},sudan:{keywords:["sd","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},suriname:{keywords:["sr","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},swaziland:{keywords:["sz","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},sweden:{keywords:["se","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},switzerland:{keywords:["ch","flag","nation","country","banner"],"char":'\ud83c\udde8\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},syria:{keywords:["syrian","arab","republic","flag","nation","country","banner"],"char":'\ud83c\uddf8\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},taiwan:{keywords:["tw","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},tajikistan:{keywords:["tj","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddef',fitzpatrick_scale:!1,category:"flags"},tanzania:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},thailand:{keywords:["th","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},timor_leste:{keywords:["timor","leste","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},togo:{keywords:["tg","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},tokelau:{keywords:["tk","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},tonga:{keywords:["to","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},trinidad_tobago:{keywords:["trinidad","tobago","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},tunisia:{keywords:["tn","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},turks_caicos_islands:{keywords:["turks","caicos","islands","flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],"char":'\ud83c\uddf9\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},uganda:{keywords:["ug","flag","nation","country","banner"],"char":'\ud83c\uddfa\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},ukraine:{keywords:["ua","flag","nation","country","banner"],"char":'\ud83c\uddfa\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},united_arab_emirates:{keywords:["united","arab","emirates","flag","nation","country","banner"],"char":'\ud83c\udde6\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},uk:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],"char":'\ud83c\uddec\ud83c\udde7',fitzpatrick_scale:!1,category:"flags"},england:{keywords:["flag","english"],"char":'\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f',fitzpatrick_scale:!1,category:"flags"},scotland:{keywords:["flag","scottish"],"char":'\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f',fitzpatrick_scale:!1,category:"flags"},wales:{keywords:["flag","welsh"],"char":'\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f',fitzpatrick_scale:!1,category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],"char":'\ud83c\uddfa\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},us_virgin_islands:{keywords:["virgin","islands","us","flag","nation","country","banner"],"char":'\ud83c\uddfb\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},uruguay:{keywords:["uy","flag","nation","country","banner"],"char":'\ud83c\uddfa\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},uzbekistan:{keywords:["uz","flag","nation","country","banner"],"char":'\ud83c\uddfa\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},vanuatu:{keywords:["vu","flag","nation","country","banner"],"char":'\ud83c\uddfb\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},vatican_city:{keywords:["vatican","city","flag","nation","country","banner"],"char":'\ud83c\uddfb\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},venezuela:{keywords:["ve","bolivarian","republic","flag","nation","country","banner"],"char":'\ud83c\uddfb\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},vietnam:{keywords:["viet","nam","flag","nation","country","banner"],"char":'\ud83c\uddfb\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},wallis_futuna:{keywords:["wallis","futuna","flag","nation","country","banner"],"char":'\ud83c\uddfc\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},western_sahara:{keywords:["western","sahara","flag","nation","country","banner"],"char":'\ud83c\uddea\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},yemen:{keywords:["ye","flag","nation","country","banner"],"char":'\ud83c\uddfe\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},zambia:{keywords:["zm","flag","nation","country","banner"],"char":'\ud83c\uddff\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},zimbabwe:{keywords:["zw","flag","nation","country","banner"],"char":'\ud83c\uddff\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},united_nations:{keywords:["un","flag","banner"],"char":'\ud83c\uddfa\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},pirate_flag:{keywords:["skull","crossbones","flag","banner"],"char":'\ud83c\udff4\u200d\u2620\ufe0f',fitzpatrick_scale:!1,category:"flags"}}); \ No newline at end of file diff --git a/src/assets/tinymce/plugins/emoticons/js/emojis.js b/src/assets/tinymce/plugins/emoticons/js/emojis.js new file mode 100644 index 00000000..4adb59b0 --- /dev/null +++ b/src/assets/tinymce/plugins/emoticons/js/emojis.js @@ -0,0 +1,9423 @@ +// Source: npm package: emojilib, file:emojis.json +window.tinymce.Resource.add("tinymce.plugins.emoticons", { + grinning: { + keywords: [ "face", "smile", "happy", "joy", ":D", "grin" ], + "char": "\ud83d\ude00", + fitzpatrick_scale: false, + category: "people" + }, + grimacing: { + keywords: [ "face", "grimace", "teeth" ], + "char": "\ud83d\ude2c", + fitzpatrick_scale: false, + category: "people" + }, + grin: { + keywords: [ "face", "happy", "smile", "joy", "kawaii" ], + "char": "\ud83d\ude01", + fitzpatrick_scale: false, + category: "people" + }, + joy: { + keywords: [ "face", "cry", "tears", "weep", "happy", "happytears", "haha" ], + "char": "\ud83d\ude02", + fitzpatrick_scale: false, + category: "people" + }, + rofl: { + keywords: [ "face", "rolling", "floor", "laughing", "lol", "haha" ], + "char": "\ud83e\udd23", + fitzpatrick_scale: false, + category: "people" + }, + partying: { + keywords: [ "face", "celebration", "woohoo" ], + "char": "\ud83e\udd73", + fitzpatrick_scale: false, + category: "people" + }, + smiley: { + keywords: [ "face", "happy", "joy", "haha", ":D", ":)", "smile", "funny" ], + "char": "\ud83d\ude03", + fitzpatrick_scale: false, + category: "people" + }, + smile: { + keywords: [ "face", "happy", "joy", "funny", "haha", "laugh", "like", ":D", ":)" ], + "char": "\ud83d\ude04", + fitzpatrick_scale: false, + category: "people" + }, + sweat_smile: { + keywords: [ "face", "hot", "happy", "laugh", "sweat", "smile", "relief" ], + "char": "\ud83d\ude05", + fitzpatrick_scale: false, + category: "people" + }, + laughing: { + keywords: [ "happy", "joy", "lol", "satisfied", "haha", "face", "glad", "XD", "laugh" ], + "char": "\ud83d\ude06", + fitzpatrick_scale: false, + category: "people" + }, + innocent: { + keywords: [ "face", "angel", "heaven", "halo" ], + "char": "\ud83d\ude07", + fitzpatrick_scale: false, + category: "people" + }, + wink: { + keywords: [ "face", "happy", "mischievous", "secret", ";)", "smile", "eye" ], + "char": "\ud83d\ude09", + fitzpatrick_scale: false, + category: "people" + }, + blush: { + keywords: [ "face", "smile", "happy", "flushed", "crush", "embarrassed", "shy", "joy" ], + "char": "\ud83d\ude0a", + fitzpatrick_scale: false, + category: "people" + }, + slightly_smiling_face: { + keywords: [ "face", "smile" ], + "char": "\ud83d\ude42", + fitzpatrick_scale: false, + category: "people" + }, + upside_down_face: { + keywords: [ "face", "flipped", "silly", "smile" ], + "char": "\ud83d\ude43", + fitzpatrick_scale: false, + category: "people" + }, + relaxed: { + keywords: [ "face", "blush", "massage", "happiness" ], + "char": "\u263a\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + yum: { + keywords: [ "happy", "joy", "tongue", "smile", "face", "silly", "yummy", "nom", "delicious", "savouring" ], + "char": "\ud83d\ude0b", + fitzpatrick_scale: false, + category: "people" + }, + relieved: { + keywords: [ "face", "relaxed", "phew", "massage", "happiness" ], + "char": "\ud83d\ude0c", + fitzpatrick_scale: false, + category: "people" + }, + heart_eyes: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "heart" ], + "char": "\ud83d\ude0d", + fitzpatrick_scale: false, + category: "people" + }, + smiling_face_with_three_hearts: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "hearts", "adore" ], + "char": "\ud83e\udd70", + fitzpatrick_scale: false, + category: "people" + }, + kissing_heart: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ], + "char": "\ud83d\ude18", + fitzpatrick_scale: false, + category: "people" + }, + kissing: { + keywords: [ "love", "like", "face", "3", "valentines", "infatuation", "kiss" ], + "char": "\ud83d\ude17", + fitzpatrick_scale: false, + category: "people" + }, + kissing_smiling_eyes: { + keywords: [ "face", "affection", "valentines", "infatuation", "kiss" ], + "char": "\ud83d\ude19", + fitzpatrick_scale: false, + category: "people" + }, + kissing_closed_eyes: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ], + "char": "\ud83d\ude1a", + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue_winking_eye: { + keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "wink", "tongue" ], + "char": "\ud83d\ude1c", + fitzpatrick_scale: false, + category: "people" + }, + zany: { + keywords: [ "face", "goofy", "crazy" ], + "char": "\ud83e\udd2a", + fitzpatrick_scale: false, + category: "people" + }, + raised_eyebrow: { + keywords: [ "face", "distrust", "scepticism", "disapproval", "disbelief", "surprise" ], + "char": "\ud83e\udd28", + fitzpatrick_scale: false, + category: "people" + }, + monocle: { + keywords: [ "face", "stuffy", "wealthy" ], + "char": "\ud83e\uddd0", + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue_closed_eyes: { + keywords: [ "face", "prank", "playful", "mischievous", "smile", "tongue" ], + "char": "\ud83d\ude1d", + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue: { + keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "tongue" ], + "char": "\ud83d\ude1b", + fitzpatrick_scale: false, + category: "people" + }, + money_mouth_face: { + keywords: [ "face", "rich", "dollar", "money" ], + "char": "\ud83e\udd11", + fitzpatrick_scale: false, + category: "people" + }, + nerd_face: { + keywords: [ "face", "nerdy", "geek", "dork" ], + "char": "\ud83e\udd13", + fitzpatrick_scale: false, + category: "people" + }, + sunglasses: { + keywords: [ "face", "cool", "smile", "summer", "beach", "sunglass" ], + "char": "\ud83d\ude0e", + fitzpatrick_scale: false, + category: "people" + }, + star_struck: { + keywords: [ "face", "smile", "starry", "eyes", "grinning" ], + "char": "\ud83e\udd29", + fitzpatrick_scale: false, + category: "people" + }, + clown_face: { + keywords: [ "face" ], + "char": "\ud83e\udd21", + fitzpatrick_scale: false, + category: "people" + }, + cowboy_hat_face: { + keywords: [ "face", "cowgirl", "hat" ], + "char": "\ud83e\udd20", + fitzpatrick_scale: false, + category: "people" + }, + hugs: { + keywords: [ "face", "smile", "hug" ], + "char": "\ud83e\udd17", + fitzpatrick_scale: false, + category: "people" + }, + smirk: { + keywords: [ "face", "smile", "mean", "prank", "smug", "sarcasm" ], + "char": "\ud83d\ude0f", + fitzpatrick_scale: false, + category: "people" + }, + no_mouth: { + keywords: [ "face", "hellokitty" ], + "char": "\ud83d\ude36", + fitzpatrick_scale: false, + category: "people" + }, + neutral_face: { + keywords: [ "indifference", "meh", ":|", "neutral" ], + "char": "\ud83d\ude10", + fitzpatrick_scale: false, + category: "people" + }, + expressionless: { + keywords: [ "face", "indifferent", "-_-", "meh", "deadpan" ], + "char": "\ud83d\ude11", + fitzpatrick_scale: false, + category: "people" + }, + unamused: { + keywords: [ "indifference", "bored", "straight face", "serious", "sarcasm", "unimpressed", "skeptical", "dubious", "side_eye" ], + "char": "\ud83d\ude12", + fitzpatrick_scale: false, + category: "people" + }, + roll_eyes: { + keywords: [ "face", "eyeroll", "frustrated" ], + "char": "\ud83d\ude44", + fitzpatrick_scale: false, + category: "people" + }, + thinking: { + keywords: [ "face", "hmmm", "think", "consider" ], + "char": "\ud83e\udd14", + fitzpatrick_scale: false, + category: "people" + }, + lying_face: { + keywords: [ "face", "lie", "pinocchio" ], + "char": "\ud83e\udd25", + fitzpatrick_scale: false, + category: "people" + }, + hand_over_mouth: { + keywords: [ "face", "whoops", "shock", "surprise" ], + "char": "\ud83e\udd2d", + fitzpatrick_scale: false, + category: "people" + }, + shushing: { + keywords: [ "face", "quiet", "shhh" ], + "char": "\ud83e\udd2b", + fitzpatrick_scale: false, + category: "people" + }, + symbols_over_mouth: { + keywords: [ "face", "swearing", "cursing", "cussing", "profanity", "expletive" ], + "char": "\ud83e\udd2c", + fitzpatrick_scale: false, + category: "people" + }, + exploding_head: { + keywords: [ "face", "shocked", "mind", "blown" ], + "char": "\ud83e\udd2f", + fitzpatrick_scale: false, + category: "people" + }, + flushed: { + keywords: [ "face", "blush", "shy", "flattered" ], + "char": "\ud83d\ude33", + fitzpatrick_scale: false, + category: "people" + }, + disappointed: { + keywords: [ "face", "sad", "upset", "depressed", ":(" ], + "char": "\ud83d\ude1e", + fitzpatrick_scale: false, + category: "people" + }, + worried: { + keywords: [ "face", "concern", "nervous", ":(" ], + "char": "\ud83d\ude1f", + fitzpatrick_scale: false, + category: "people" + }, + angry: { + keywords: [ "mad", "face", "annoyed", "frustrated" ], + "char": "\ud83d\ude20", + fitzpatrick_scale: false, + category: "people" + }, + rage: { + keywords: [ "angry", "mad", "hate", "despise" ], + "char": "\ud83d\ude21", + fitzpatrick_scale: false, + category: "people" + }, + pensive: { + keywords: [ "face", "sad", "depressed", "upset" ], + "char": "\ud83d\ude14", + fitzpatrick_scale: false, + category: "people" + }, + confused: { + keywords: [ "face", "indifference", "huh", "weird", "hmmm", ":/" ], + "char": "\ud83d\ude15", + fitzpatrick_scale: false, + category: "people" + }, + slightly_frowning_face: { + keywords: [ "face", "frowning", "disappointed", "sad", "upset" ], + "char": "\ud83d\ude41", + fitzpatrick_scale: false, + category: "people" + }, + frowning_face: { + keywords: [ "face", "sad", "upset", "frown" ], + "char": "\u2639", + fitzpatrick_scale: false, + category: "people" + }, + persevere: { + keywords: [ "face", "sick", "no", "upset", "oops" ], + "char": "\ud83d\ude23", + fitzpatrick_scale: false, + category: "people" + }, + confounded: { + keywords: [ "face", "confused", "sick", "unwell", "oops", ":S" ], + "char": "\ud83d\ude16", + fitzpatrick_scale: false, + category: "people" + }, + tired_face: { + keywords: [ "sick", "whine", "upset", "frustrated" ], + "char": "\ud83d\ude2b", + fitzpatrick_scale: false, + category: "people" + }, + weary: { + keywords: [ "face", "tired", "sleepy", "sad", "frustrated", "upset" ], + "char": "\ud83d\ude29", + fitzpatrick_scale: false, + category: "people" + }, + pleading: { + keywords: [ "face", "begging", "mercy" ], + "char": "\ud83e\udd7a", + fitzpatrick_scale: false, + category: "people" + }, + triumph: { + keywords: [ "face", "gas", "phew", "proud", "pride" ], + "char": "\ud83d\ude24", + fitzpatrick_scale: false, + category: "people" + }, + open_mouth: { + keywords: [ "face", "surprise", "impressed", "wow", "whoa", ":O" ], + "char": "\ud83d\ude2e", + fitzpatrick_scale: false, + category: "people" + }, + scream: { + keywords: [ "face", "munch", "scared", "omg" ], + "char": "\ud83d\ude31", + fitzpatrick_scale: false, + category: "people" + }, + fearful: { + keywords: [ "face", "scared", "terrified", "nervous", "oops", "huh" ], + "char": "\ud83d\ude28", + fitzpatrick_scale: false, + category: "people" + }, + cold_sweat: { + keywords: [ "face", "nervous", "sweat" ], + "char": "\ud83d\ude30", + fitzpatrick_scale: false, + category: "people" + }, + hushed: { + keywords: [ "face", "woo", "shh" ], + "char": "\ud83d\ude2f", + fitzpatrick_scale: false, + category: "people" + }, + frowning: { + keywords: [ "face", "aw", "what" ], + "char": "\ud83d\ude26", + fitzpatrick_scale: false, + category: "people" + }, + anguished: { + keywords: [ "face", "stunned", "nervous" ], + "char": "\ud83d\ude27", + fitzpatrick_scale: false, + category: "people" + }, + cry: { + keywords: [ "face", "tears", "sad", "depressed", "upset", ":'(" ], + "char": "\ud83d\ude22", + fitzpatrick_scale: false, + category: "people" + }, + disappointed_relieved: { + keywords: [ "face", "phew", "sweat", "nervous" ], + "char": "\ud83d\ude25", + fitzpatrick_scale: false, + category: "people" + }, + drooling_face: { + keywords: [ "face" ], + "char": "\ud83e\udd24", + fitzpatrick_scale: false, + category: "people" + }, + sleepy: { + keywords: [ "face", "tired", "rest", "nap" ], + "char": "\ud83d\ude2a", + fitzpatrick_scale: false, + category: "people" + }, + sweat: { + keywords: [ "face", "hot", "sad", "tired", "exercise" ], + "char": "\ud83d\ude13", + fitzpatrick_scale: false, + category: "people" + }, + hot: { + keywords: [ "face", "feverish", "heat", "red", "sweating" ], + "char": "\ud83e\udd75", + fitzpatrick_scale: false, + category: "people" + }, + cold: { + keywords: [ "face", "blue", "freezing", "frozen", "frostbite", "icicles" ], + "char": "\ud83e\udd76", + fitzpatrick_scale: false, + category: "people" + }, + sob: { + keywords: [ "face", "cry", "tears", "sad", "upset", "depressed" ], + "char": "\ud83d\ude2d", + fitzpatrick_scale: false, + category: "people" + }, + dizzy_face: { + keywords: [ "spent", "unconscious", "xox", "dizzy" ], + "char": "\ud83d\ude35", + fitzpatrick_scale: false, + category: "people" + }, + astonished: { + keywords: [ "face", "xox", "surprised", "poisoned" ], + "char": "\ud83d\ude32", + fitzpatrick_scale: false, + category: "people" + }, + zipper_mouth_face: { + keywords: [ "face", "sealed", "zipper", "secret" ], + "char": "\ud83e\udd10", + fitzpatrick_scale: false, + category: "people" + }, + nauseated_face: { + keywords: [ "face", "vomit", "gross", "green", "sick", "throw up", "ill" ], + "char": "\ud83e\udd22", + fitzpatrick_scale: false, + category: "people" + }, + sneezing_face: { + keywords: [ "face", "gesundheit", "sneeze", "sick", "allergy" ], + "char": "\ud83e\udd27", + fitzpatrick_scale: false, + category: "people" + }, + vomiting: { + keywords: [ "face", "sick" ], + "char": "\ud83e\udd2e", + fitzpatrick_scale: false, + category: "people" + }, + mask: { + keywords: [ "face", "sick", "ill", "disease" ], + "char": "\ud83d\ude37", + fitzpatrick_scale: false, + category: "people" + }, + face_with_thermometer: { + keywords: [ "sick", "temperature", "thermometer", "cold", "fever" ], + "char": "\ud83e\udd12", + fitzpatrick_scale: false, + category: "people" + }, + face_with_head_bandage: { + keywords: [ "injured", "clumsy", "bandage", "hurt" ], + "char": "\ud83e\udd15", + fitzpatrick_scale: false, + category: "people" + }, + woozy: { + keywords: [ "face", "dizzy", "intoxicated", "tipsy", "wavy" ], + "char": "\ud83e\udd74", + fitzpatrick_scale: false, + category: "people" + }, + sleeping: { + keywords: [ "face", "tired", "sleepy", "night", "zzz" ], + "char": "\ud83d\ude34", + fitzpatrick_scale: false, + category: "people" + }, + zzz: { + keywords: [ "sleepy", "tired", "dream" ], + "char": "\ud83d\udca4", + fitzpatrick_scale: false, + category: "people" + }, + poop: { + keywords: [ "hankey", "shitface", "fail", "turd", "shit" ], + "char": "\ud83d\udca9", + fitzpatrick_scale: false, + category: "people" + }, + smiling_imp: { + keywords: [ "devil", "horns" ], + "char": "\ud83d\ude08", + fitzpatrick_scale: false, + category: "people" + }, + imp: { + keywords: [ "devil", "angry", "horns" ], + "char": "\ud83d\udc7f", + fitzpatrick_scale: false, + category: "people" + }, + japanese_ogre: { + keywords: [ "monster", "red", "mask", "halloween", "scary", "creepy", "devil", "demon", "japanese", "ogre" ], + "char": "\ud83d\udc79", + fitzpatrick_scale: false, + category: "people" + }, + japanese_goblin: { + keywords: [ "red", "evil", "mask", "monster", "scary", "creepy", "japanese", "goblin" ], + "char": "\ud83d\udc7a", + fitzpatrick_scale: false, + category: "people" + }, + skull: { + keywords: [ "dead", "skeleton", "creepy", "death" ], + "char": "\ud83d\udc80", + fitzpatrick_scale: false, + category: "people" + }, + ghost: { + keywords: [ "halloween", "spooky", "scary" ], + "char": "\ud83d\udc7b", + fitzpatrick_scale: false, + category: "people" + }, + alien: { + keywords: [ "UFO", "paul", "weird", "outer_space" ], + "char": "\ud83d\udc7d", + fitzpatrick_scale: false, + category: "people" + }, + robot: { + keywords: [ "computer", "machine", "bot" ], + "char": "\ud83e\udd16", + fitzpatrick_scale: false, + category: "people" + }, + smiley_cat: { + keywords: [ "animal", "cats", "happy", "smile" ], + "char": "\ud83d\ude3a", + fitzpatrick_scale: false, + category: "people" + }, + smile_cat: { + keywords: [ "animal", "cats", "smile" ], + "char": "\ud83d\ude38", + fitzpatrick_scale: false, + category: "people" + }, + joy_cat: { + keywords: [ "animal", "cats", "haha", "happy", "tears" ], + "char": "\ud83d\ude39", + fitzpatrick_scale: false, + category: "people" + }, + heart_eyes_cat: { + keywords: [ "animal", "love", "like", "affection", "cats", "valentines", "heart" ], + "char": "\ud83d\ude3b", + fitzpatrick_scale: false, + category: "people" + }, + smirk_cat: { + keywords: [ "animal", "cats", "smirk" ], + "char": "\ud83d\ude3c", + fitzpatrick_scale: false, + category: "people" + }, + kissing_cat: { + keywords: [ "animal", "cats", "kiss" ], + "char": "\ud83d\ude3d", + fitzpatrick_scale: false, + category: "people" + }, + scream_cat: { + keywords: [ "animal", "cats", "munch", "scared", "scream" ], + "char": "\ud83d\ude40", + fitzpatrick_scale: false, + category: "people" + }, + crying_cat_face: { + keywords: [ "animal", "tears", "weep", "sad", "cats", "upset", "cry" ], + "char": "\ud83d\ude3f", + fitzpatrick_scale: false, + category: "people" + }, + pouting_cat: { + keywords: [ "animal", "cats" ], + "char": "\ud83d\ude3e", + fitzpatrick_scale: false, + category: "people" + }, + palms_up: { + keywords: [ "hands", "gesture", "cupped", "prayer" ], + "char": "\ud83e\udd32", + fitzpatrick_scale: true, + category: "people" + }, + raised_hands: { + keywords: [ "gesture", "hooray", "yea", "celebration", "hands" ], + "char": "\ud83d\ude4c", + fitzpatrick_scale: true, + category: "people" + }, + clap: { + keywords: [ "hands", "praise", "applause", "congrats", "yay" ], + "char": "\ud83d\udc4f", + fitzpatrick_scale: true, + category: "people" + }, + wave: { + keywords: [ "hands", "gesture", "goodbye", "solong", "farewell", "hello", "hi", "palm" ], + "char": "\ud83d\udc4b", + fitzpatrick_scale: true, + category: "people" + }, + call_me_hand: { + keywords: [ "hands", "gesture" ], + "char": "\ud83e\udd19", + fitzpatrick_scale: true, + category: "people" + }, + "+1": { + keywords: [ "thumbsup", "yes", "awesome", "good", "agree", "accept", "cool", "hand", "like" ], + "char": "\ud83d\udc4d", + fitzpatrick_scale: true, + category: "people" + }, + "-1": { + keywords: [ "thumbsdown", "no", "dislike", "hand" ], + "char": "\ud83d\udc4e", + fitzpatrick_scale: true, + category: "people" + }, + facepunch: { + keywords: [ "angry", "violence", "fist", "hit", "attack", "hand" ], + "char": "\ud83d\udc4a", + fitzpatrick_scale: true, + category: "people" + }, + fist: { + keywords: [ "fingers", "hand", "grasp" ], + "char": "\u270a", + fitzpatrick_scale: true, + category: "people" + }, + fist_left: { + keywords: [ "hand", "fistbump" ], + "char": "\ud83e\udd1b", + fitzpatrick_scale: true, + category: "people" + }, + fist_right: { + keywords: [ "hand", "fistbump" ], + "char": "\ud83e\udd1c", + fitzpatrick_scale: true, + category: "people" + }, + v: { + keywords: [ "fingers", "ohyeah", "hand", "peace", "victory", "two" ], + "char": "\u270c", + fitzpatrick_scale: true, + category: "people" + }, + ok_hand: { + keywords: [ "fingers", "limbs", "perfect", "ok", "okay" ], + "char": "\ud83d\udc4c", + fitzpatrick_scale: true, + category: "people" + }, + raised_hand: { + keywords: [ "fingers", "stop", "highfive", "palm", "ban" ], + "char": "\u270b", + fitzpatrick_scale: true, + category: "people" + }, + raised_back_of_hand: { + keywords: [ "fingers", "raised", "backhand" ], + "char": "\ud83e\udd1a", + fitzpatrick_scale: true, + category: "people" + }, + open_hands: { + keywords: [ "fingers", "butterfly", "hands", "open" ], + "char": "\ud83d\udc50", + fitzpatrick_scale: true, + category: "people" + }, + muscle: { + keywords: [ "arm", "flex", "hand", "summer", "strong", "biceps" ], + "char": "\ud83d\udcaa", + fitzpatrick_scale: true, + category: "people" + }, + pray: { + keywords: [ "please", "hope", "wish", "namaste", "highfive" ], + "char": "\ud83d\ude4f", + fitzpatrick_scale: true, + category: "people" + }, + foot: { + keywords: [ "kick", "stomp" ], + "char": "\ud83e\uddb6", + fitzpatrick_scale: true, + category: "people" + }, + leg: { + keywords: [ "kick", "limb" ], + "char": "\ud83e\uddb5", + fitzpatrick_scale: true, + category: "people" + }, + handshake: { + keywords: [ "agreement", "shake" ], + "char": "\ud83e\udd1d", + fitzpatrick_scale: false, + category: "people" + }, + point_up: { + keywords: [ "hand", "fingers", "direction", "up" ], + "char": "\u261d", + fitzpatrick_scale: true, + category: "people" + }, + point_up_2: { + keywords: [ "fingers", "hand", "direction", "up" ], + "char": "\ud83d\udc46", + fitzpatrick_scale: true, + category: "people" + }, + point_down: { + keywords: [ "fingers", "hand", "direction", "down" ], + "char": "\ud83d\udc47", + fitzpatrick_scale: true, + category: "people" + }, + point_left: { + keywords: [ "direction", "fingers", "hand", "left" ], + "char": "\ud83d\udc48", + fitzpatrick_scale: true, + category: "people" + }, + point_right: { + keywords: [ "fingers", "hand", "direction", "right" ], + "char": "\ud83d\udc49", + fitzpatrick_scale: true, + category: "people" + }, + fu: { + keywords: [ "hand", "fingers", "rude", "middle", "flipping" ], + "char": "\ud83d\udd95", + fitzpatrick_scale: true, + category: "people" + }, + raised_hand_with_fingers_splayed: { + keywords: [ "hand", "fingers", "palm" ], + "char": "\ud83d\udd90", + fitzpatrick_scale: true, + category: "people" + }, + love_you: { + keywords: [ "hand", "fingers", "gesture" ], + "char": "\ud83e\udd1f", + fitzpatrick_scale: true, + category: "people" + }, + metal: { + keywords: [ "hand", "fingers", "evil_eye", "sign_of_horns", "rock_on" ], + "char": "\ud83e\udd18", + fitzpatrick_scale: true, + category: "people" + }, + crossed_fingers: { + keywords: [ "good", "lucky" ], + "char": "\ud83e\udd1e", + fitzpatrick_scale: true, + category: "people" + }, + vulcan_salute: { + keywords: [ "hand", "fingers", "spock", "star trek" ], + "char": "\ud83d\udd96", + fitzpatrick_scale: true, + category: "people" + }, + writing_hand: { + keywords: [ "lower_left_ballpoint_pen", "stationery", "write", "compose" ], + "char": "\u270d", + fitzpatrick_scale: true, + category: "people" + }, + selfie: { + keywords: [ "camera", "phone" ], + "char": "\ud83e\udd33", + fitzpatrick_scale: true, + category: "people" + }, + nail_care: { + keywords: [ "beauty", "manicure", "finger", "fashion", "nail" ], + "char": "\ud83d\udc85", + fitzpatrick_scale: true, + category: "people" + }, + lips: { + keywords: [ "mouth", "kiss" ], + "char": "\ud83d\udc44", + fitzpatrick_scale: false, + category: "people" + }, + tooth: { + keywords: [ "teeth", "dentist" ], + "char": "\ud83e\uddb7", + fitzpatrick_scale: false, + category: "people" + }, + tongue: { + keywords: [ "mouth", "playful" ], + "char": "\ud83d\udc45", + fitzpatrick_scale: false, + category: "people" + }, + ear: { + keywords: [ "face", "hear", "sound", "listen" ], + "char": "\ud83d\udc42", + fitzpatrick_scale: true, + category: "people" + }, + nose: { + keywords: [ "smell", "sniff" ], + "char": "\ud83d\udc43", + fitzpatrick_scale: true, + category: "people" + }, + eye: { + keywords: [ "face", "look", "see", "watch", "stare" ], + "char": "\ud83d\udc41", + fitzpatrick_scale: false, + category: "people" + }, + eyes: { + keywords: [ "look", "watch", "stalk", "peek", "see" ], + "char": "\ud83d\udc40", + fitzpatrick_scale: false, + category: "people" + }, + brain: { + keywords: [ "smart", "intelligent" ], + "char": "\ud83e\udde0", + fitzpatrick_scale: false, + category: "people" + }, + bust_in_silhouette: { + keywords: [ "user", "person", "human" ], + "char": "\ud83d\udc64", + fitzpatrick_scale: false, + category: "people" + }, + busts_in_silhouette: { + keywords: [ "user", "person", "human", "group", "team" ], + "char": "\ud83d\udc65", + fitzpatrick_scale: false, + category: "people" + }, + speaking_head: { + keywords: [ "user", "person", "human", "sing", "say", "talk" ], + "char": "\ud83d\udde3", + fitzpatrick_scale: false, + category: "people" + }, + baby: { + keywords: [ "child", "boy", "girl", "toddler" ], + "char": "\ud83d\udc76", + fitzpatrick_scale: true, + category: "people" + }, + child: { + keywords: [ "gender-neutral", "young" ], + "char": "\ud83e\uddd2", + fitzpatrick_scale: true, + category: "people" + }, + boy: { + keywords: [ "man", "male", "guy", "teenager" ], + "char": "\ud83d\udc66", + fitzpatrick_scale: true, + category: "people" + }, + girl: { + keywords: [ "female", "woman", "teenager" ], + "char": "\ud83d\udc67", + fitzpatrick_scale: true, + category: "people" + }, + adult: { + keywords: [ "gender-neutral", "person" ], + "char": "\ud83e\uddd1", + fitzpatrick_scale: true, + category: "people" + }, + man: { + keywords: [ "mustache", "father", "dad", "guy", "classy", "sir", "moustache" ], + "char": "\ud83d\udc68", + fitzpatrick_scale: true, + category: "people" + }, + woman: { + keywords: [ "female", "girls", "lady" ], + "char": "\ud83d\udc69", + fitzpatrick_scale: true, + category: "people" + }, + blonde_woman: { + keywords: [ "woman", "female", "girl", "blonde", "person" ], + "char": "\ud83d\udc71\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + blonde_man: { + keywords: [ "man", "male", "boy", "blonde", "guy", "person" ], + "char": "\ud83d\udc71", + fitzpatrick_scale: true, + category: "people" + }, + bearded_person: { + keywords: [ "person", "bewhiskered" ], + "char": "\ud83e\uddd4", + fitzpatrick_scale: true, + category: "people" + }, + older_adult: { + keywords: [ "human", "elder", "senior", "gender-neutral" ], + "char": "\ud83e\uddd3", + fitzpatrick_scale: true, + category: "people" + }, + older_man: { + keywords: [ "human", "male", "men", "old", "elder", "senior" ], + "char": "\ud83d\udc74", + fitzpatrick_scale: true, + category: "people" + }, + older_woman: { + keywords: [ "human", "female", "women", "lady", "old", "elder", "senior" ], + "char": "\ud83d\udc75", + fitzpatrick_scale: true, + category: "people" + }, + man_with_gua_pi_mao: { + keywords: [ "male", "boy", "chinese" ], + "char": "\ud83d\udc72", + fitzpatrick_scale: true, + category: "people" + }, + woman_with_headscarf: { + keywords: [ "female", "hijab", "mantilla", "tichel" ], + "char": "\ud83e\uddd5", + fitzpatrick_scale: true, + category: "people" + }, + woman_with_turban: { + keywords: [ "female", "indian", "hinduism", "arabs", "woman" ], + "char": "\ud83d\udc73\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_with_turban: { + keywords: [ "male", "indian", "hinduism", "arabs" ], + "char": "\ud83d\udc73", + fitzpatrick_scale: true, + category: "people" + }, + policewoman: { + keywords: [ "woman", "police", "law", "legal", "enforcement", "arrest", "911", "female" ], + "char": "\ud83d\udc6e\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + policeman: { + keywords: [ "man", "police", "law", "legal", "enforcement", "arrest", "911" ], + "char": "\ud83d\udc6e", + fitzpatrick_scale: true, + category: "people" + }, + construction_worker_woman: { + keywords: [ "female", "human", "wip", "build", "construction", "worker", "labor", "woman" ], + "char": "\ud83d\udc77\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + construction_worker_man: { + keywords: [ "male", "human", "wip", "guy", "build", "construction", "worker", "labor" ], + "char": "\ud83d\udc77", + fitzpatrick_scale: true, + category: "people" + }, + guardswoman: { + keywords: [ "uk", "gb", "british", "female", "royal", "woman" ], + "char": "\ud83d\udc82\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + guardsman: { + keywords: [ "uk", "gb", "british", "male", "guy", "royal" ], + "char": "\ud83d\udc82", + fitzpatrick_scale: true, + category: "people" + }, + female_detective: { + keywords: [ "human", "spy", "detective", "female", "woman" ], + "char": "\ud83d\udd75\ufe0f\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + male_detective: { + keywords: [ "human", "spy", "detective" ], + "char": "\ud83d\udd75", + fitzpatrick_scale: true, + category: "people" + }, + woman_health_worker: { + keywords: [ "doctor", "nurse", "therapist", "healthcare", "woman", "human" ], + "char": "\ud83d\udc69\u200d\u2695\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_health_worker: { + keywords: [ "doctor", "nurse", "therapist", "healthcare", "man", "human" ], + "char": "\ud83d\udc68\u200d\u2695\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_farmer: { + keywords: [ "rancher", "gardener", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83c\udf3e", + fitzpatrick_scale: true, + category: "people" + }, + man_farmer: { + keywords: [ "rancher", "gardener", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83c\udf3e", + fitzpatrick_scale: true, + category: "people" + }, + woman_cook: { + keywords: [ "chef", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83c\udf73", + fitzpatrick_scale: true, + category: "people" + }, + man_cook: { + keywords: [ "chef", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83c\udf73", + fitzpatrick_scale: true, + category: "people" + }, + woman_student: { + keywords: [ "graduate", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83c\udf93", + fitzpatrick_scale: true, + category: "people" + }, + man_student: { + keywords: [ "graduate", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83c\udf93", + fitzpatrick_scale: true, + category: "people" + }, + woman_singer: { + keywords: [ "rockstar", "entertainer", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83c\udfa4", + fitzpatrick_scale: true, + category: "people" + }, + man_singer: { + keywords: [ "rockstar", "entertainer", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83c\udfa4", + fitzpatrick_scale: true, + category: "people" + }, + woman_teacher: { + keywords: [ "instructor", "professor", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83c\udfeb", + fitzpatrick_scale: true, + category: "people" + }, + man_teacher: { + keywords: [ "instructor", "professor", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83c\udfeb", + fitzpatrick_scale: true, + category: "people" + }, + woman_factory_worker: { + keywords: [ "assembly", "industrial", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83c\udfed", + fitzpatrick_scale: true, + category: "people" + }, + man_factory_worker: { + keywords: [ "assembly", "industrial", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83c\udfed", + fitzpatrick_scale: true, + category: "people" + }, + woman_technologist: { + keywords: [ "coder", "developer", "engineer", "programmer", "software", "woman", "human", "laptop", "computer" ], + "char": "\ud83d\udc69\u200d\ud83d\udcbb", + fitzpatrick_scale: true, + category: "people" + }, + man_technologist: { + keywords: [ "coder", "developer", "engineer", "programmer", "software", "man", "human", "laptop", "computer" ], + "char": "\ud83d\udc68\u200d\ud83d\udcbb", + fitzpatrick_scale: true, + category: "people" + }, + woman_office_worker: { + keywords: [ "business", "manager", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83d\udcbc", + fitzpatrick_scale: true, + category: "people" + }, + man_office_worker: { + keywords: [ "business", "manager", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83d\udcbc", + fitzpatrick_scale: true, + category: "people" + }, + woman_mechanic: { + keywords: [ "plumber", "woman", "human", "wrench" ], + "char": "\ud83d\udc69\u200d\ud83d\udd27", + fitzpatrick_scale: true, + category: "people" + }, + man_mechanic: { + keywords: [ "plumber", "man", "human", "wrench" ], + "char": "\ud83d\udc68\u200d\ud83d\udd27", + fitzpatrick_scale: true, + category: "people" + }, + woman_scientist: { + keywords: [ "biologist", "chemist", "engineer", "physicist", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83d\udd2c", + fitzpatrick_scale: true, + category: "people" + }, + man_scientist: { + keywords: [ "biologist", "chemist", "engineer", "physicist", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83d\udd2c", + fitzpatrick_scale: true, + category: "people" + }, + woman_artist: { + keywords: [ "painter", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83c\udfa8", + fitzpatrick_scale: true, + category: "people" + }, + man_artist: { + keywords: [ "painter", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83c\udfa8", + fitzpatrick_scale: true, + category: "people" + }, + woman_firefighter: { + keywords: [ "fireman", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83d\ude92", + fitzpatrick_scale: true, + category: "people" + }, + man_firefighter: { + keywords: [ "fireman", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83d\ude92", + fitzpatrick_scale: true, + category: "people" + }, + woman_pilot: { + keywords: [ "aviator", "plane", "woman", "human" ], + "char": "\ud83d\udc69\u200d\u2708\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_pilot: { + keywords: [ "aviator", "plane", "man", "human" ], + "char": "\ud83d\udc68\u200d\u2708\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_astronaut: { + keywords: [ "space", "rocket", "woman", "human" ], + "char": "\ud83d\udc69\u200d\ud83d\ude80", + fitzpatrick_scale: true, + category: "people" + }, + man_astronaut: { + keywords: [ "space", "rocket", "man", "human" ], + "char": "\ud83d\udc68\u200d\ud83d\ude80", + fitzpatrick_scale: true, + category: "people" + }, + woman_judge: { + keywords: [ "justice", "court", "woman", "human" ], + "char": "\ud83d\udc69\u200d\u2696\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_judge: { + keywords: [ "justice", "court", "man", "human" ], + "char": "\ud83d\udc68\u200d\u2696\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_superhero: { + keywords: [ "woman", "female", "good", "heroine", "superpowers" ], + "char": "\ud83e\uddb8\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_superhero: { + keywords: [ "man", "male", "good", "hero", "superpowers" ], + "char": "\ud83e\uddb8\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_supervillain: { + keywords: [ "woman", "female", "evil", "bad", "criminal", "heroine", "superpowers" ], + "char": "\ud83e\uddb9\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_supervillain: { + keywords: [ "man", "male", "evil", "bad", "criminal", "hero", "superpowers" ], + "char": "\ud83e\uddb9\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + mrs_claus: { + keywords: [ "woman", "female", "xmas", "mother christmas" ], + "char": "\ud83e\udd36", + fitzpatrick_scale: true, + category: "people" + }, + santa: { + keywords: [ "festival", "man", "male", "xmas", "father christmas" ], + "char": "\ud83c\udf85", + fitzpatrick_scale: true, + category: "people" + }, + sorceress: { + keywords: [ "woman", "female", "mage", "witch" ], + "char": "\ud83e\uddd9\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + wizard: { + keywords: [ "man", "male", "mage", "sorcerer" ], + "char": "\ud83e\uddd9\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_elf: { + keywords: [ "woman", "female" ], + "char": "\ud83e\udddd\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_elf: { + keywords: [ "man", "male" ], + "char": "\ud83e\udddd\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_vampire: { + keywords: [ "woman", "female" ], + "char": "\ud83e\udddb\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_vampire: { + keywords: [ "man", "male", "dracula" ], + "char": "\ud83e\udddb\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_zombie: { + keywords: [ "woman", "female", "undead", "walking dead" ], + "char": "\ud83e\udddf\u200d\u2640\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + man_zombie: { + keywords: [ "man", "male", "dracula", "undead", "walking dead" ], + "char": "\ud83e\udddf\u200d\u2642\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + woman_genie: { + keywords: [ "woman", "female" ], + "char": "\ud83e\uddde\u200d\u2640\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + man_genie: { + keywords: [ "man", "male" ], + "char": "\ud83e\uddde\u200d\u2642\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + mermaid: { + keywords: [ "woman", "female", "merwoman", "ariel" ], + "char": "\ud83e\udddc\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + merman: { + keywords: [ "man", "male", "triton" ], + "char": "\ud83e\udddc\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_fairy: { + keywords: [ "woman", "female" ], + "char": "\ud83e\uddda\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_fairy: { + keywords: [ "man", "male" ], + "char": "\ud83e\uddda\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + angel: { + keywords: [ "heaven", "wings", "halo" ], + "char": "\ud83d\udc7c", + fitzpatrick_scale: true, + category: "people" + }, + pregnant_woman: { + keywords: [ "baby" ], + "char": "\ud83e\udd30", + fitzpatrick_scale: true, + category: "people" + }, + breastfeeding: { + keywords: [ "nursing", "baby" ], + "char": "\ud83e\udd31", + fitzpatrick_scale: true, + category: "people" + }, + princess: { + keywords: [ "girl", "woman", "female", "blond", "crown", "royal", "queen" ], + "char": "\ud83d\udc78", + fitzpatrick_scale: true, + category: "people" + }, + prince: { + keywords: [ "boy", "man", "male", "crown", "royal", "king" ], + "char": "\ud83e\udd34", + fitzpatrick_scale: true, + category: "people" + }, + bride_with_veil: { + keywords: [ "couple", "marriage", "wedding", "woman", "bride" ], + "char": "\ud83d\udc70", + fitzpatrick_scale: true, + category: "people" + }, + man_in_tuxedo: { + keywords: [ "couple", "marriage", "wedding", "groom" ], + "char": "\ud83e\udd35", + fitzpatrick_scale: true, + category: "people" + }, + running_woman: { + keywords: [ "woman", "walking", "exercise", "race", "running", "female" ], + "char": "\ud83c\udfc3\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + running_man: { + keywords: [ "man", "walking", "exercise", "race", "running" ], + "char": "\ud83c\udfc3", + fitzpatrick_scale: true, + category: "people" + }, + walking_woman: { + keywords: [ "human", "feet", "steps", "woman", "female" ], + "char": "\ud83d\udeb6\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + walking_man: { + keywords: [ "human", "feet", "steps" ], + "char": "\ud83d\udeb6", + fitzpatrick_scale: true, + category: "people" + }, + dancer: { + keywords: [ "female", "girl", "woman", "fun" ], + "char": "\ud83d\udc83", + fitzpatrick_scale: true, + category: "people" + }, + man_dancing: { + keywords: [ "male", "boy", "fun", "dancer" ], + "char": "\ud83d\udd7a", + fitzpatrick_scale: true, + category: "people" + }, + dancing_women: { + keywords: [ "female", "bunny", "women", "girls" ], + "char": "\ud83d\udc6f", + fitzpatrick_scale: false, + category: "people" + }, + dancing_men: { + keywords: [ "male", "bunny", "men", "boys" ], + "char": "\ud83d\udc6f\u200d\u2642\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + couple: { + keywords: [ "pair", "people", "human", "love", "date", "dating", "like", "affection", "valentines", "marriage" ], + "char": "\ud83d\udc6b", + fitzpatrick_scale: false, + category: "people" + }, + two_men_holding_hands: { + keywords: [ "pair", "couple", "love", "like", "bromance", "friendship", "people", "human" ], + "char": "\ud83d\udc6c", + fitzpatrick_scale: false, + category: "people" + }, + two_women_holding_hands: { + keywords: [ "pair", "friendship", "couple", "love", "like", "female", "people", "human" ], + "char": "\ud83d\udc6d", + fitzpatrick_scale: false, + category: "people" + }, + bowing_woman: { + keywords: [ "woman", "female", "girl" ], + "char": "\ud83d\ude47\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + bowing_man: { + keywords: [ "man", "male", "boy" ], + "char": "\ud83d\ude47", + fitzpatrick_scale: true, + category: "people" + }, + man_facepalming: { + keywords: [ "man", "male", "boy", "disbelief" ], + "char": "\ud83e\udd26\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_facepalming: { + keywords: [ "woman", "female", "girl", "disbelief" ], + "char": "\ud83e\udd26\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_shrugging: { + keywords: [ "woman", "female", "girl", "confused", "indifferent", "doubt" ], + "char": "\ud83e\udd37", + fitzpatrick_scale: true, + category: "people" + }, + man_shrugging: { + keywords: [ "man", "male", "boy", "confused", "indifferent", "doubt" ], + "char": "\ud83e\udd37\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + tipping_hand_woman: { + keywords: [ "female", "girl", "woman", "human", "information" ], + "char": "\ud83d\udc81", + fitzpatrick_scale: true, + category: "people" + }, + tipping_hand_man: { + keywords: [ "male", "boy", "man", "human", "information" ], + "char": "\ud83d\udc81\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + no_good_woman: { + keywords: [ "female", "girl", "woman", "nope" ], + "char": "\ud83d\ude45", + fitzpatrick_scale: true, + category: "people" + }, + no_good_man: { + keywords: [ "male", "boy", "man", "nope" ], + "char": "\ud83d\ude45\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + ok_woman: { + keywords: [ "women", "girl", "female", "pink", "human", "woman" ], + "char": "\ud83d\ude46", + fitzpatrick_scale: true, + category: "people" + }, + ok_man: { + keywords: [ "men", "boy", "male", "blue", "human", "man" ], + "char": "\ud83d\ude46\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + raising_hand_woman: { + keywords: [ "female", "girl", "woman" ], + "char": "\ud83d\ude4b", + fitzpatrick_scale: true, + category: "people" + }, + raising_hand_man: { + keywords: [ "male", "boy", "man" ], + "char": "\ud83d\ude4b\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + pouting_woman: { + keywords: [ "female", "girl", "woman" ], + "char": "\ud83d\ude4e", + fitzpatrick_scale: true, + category: "people" + }, + pouting_man: { + keywords: [ "male", "boy", "man" ], + "char": "\ud83d\ude4e\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + frowning_woman: { + keywords: [ "female", "girl", "woman", "sad", "depressed", "discouraged", "unhappy" ], + "char": "\ud83d\ude4d", + fitzpatrick_scale: true, + category: "people" + }, + frowning_man: { + keywords: [ "male", "boy", "man", "sad", "depressed", "discouraged", "unhappy" ], + "char": "\ud83d\ude4d\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + haircut_woman: { + keywords: [ "female", "girl", "woman" ], + "char": "\ud83d\udc87", + fitzpatrick_scale: true, + category: "people" + }, + haircut_man: { + keywords: [ "male", "boy", "man" ], + "char": "\ud83d\udc87\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + massage_woman: { + keywords: [ "female", "girl", "woman", "head" ], + "char": "\ud83d\udc86", + fitzpatrick_scale: true, + category: "people" + }, + massage_man: { + keywords: [ "male", "boy", "man", "head" ], + "char": "\ud83d\udc86\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_in_steamy_room: { + keywords: [ "female", "woman", "spa", "steamroom", "sauna" ], + "char": "\ud83e\uddd6\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_in_steamy_room: { + keywords: [ "male", "man", "spa", "steamroom", "sauna" ], + "char": "\ud83e\uddd6\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + couple_with_heart_woman_man: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + "char": "\ud83d\udc91", + fitzpatrick_scale: false, + category: "people" + }, + couple_with_heart_woman_woman: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + "char": "\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69", + fitzpatrick_scale: false, + category: "people" + }, + couple_with_heart_man_man: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + "char": "\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68", + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_man_woman: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + "char": "\ud83d\udc8f", + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_woman_woman: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + "char": "\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69", + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_man_man: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + "char": "\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68", + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_boy: { + keywords: [ "home", "parents", "child", "mom", "dad", "father", "mother", "people", "human" ], + "char": "\ud83d\udc6a", + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl: { + keywords: [ "home", "parents", "people", "human", "child" ], + "char": "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_boy: { + keywords: [ "home", "parent", "people", "human", "child" ], + "char": "\ud83d\udc69\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl: { + keywords: [ "home", "parent", "people", "human", "child" ], + "char": "\ud83d\udc69\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": "\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_boy_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": "\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl_girl: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": "\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_man_boy: { + keywords: [ "home", "parent", "people", "human", "child" ], + "char": "\ud83d\udc68\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl: { + keywords: [ "home", "parent", "people", "human", "child" ], + "char": "\ud83d\udc68\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_boy_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl_girl: { + keywords: [ "home", "parent", "people", "human", "children" ], + "char": "\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + yarn: { + keywords: [ "ball", "crochet", "knit" ], + "char": "\ud83e\uddf6", + fitzpatrick_scale: false, + category: "people" + }, + thread: { + keywords: [ "needle", "sewing", "spool", "string" ], + "char": "\ud83e\uddf5", + fitzpatrick_scale: false, + category: "people" + }, + coat: { + keywords: [ "jacket" ], + "char": "\ud83e\udde5", + fitzpatrick_scale: false, + category: "people" + }, + labcoat: { + keywords: [ "doctor", "experiment", "scientist", "chemist" ], + "char": "\ud83e\udd7c", + fitzpatrick_scale: false, + category: "people" + }, + womans_clothes: { + keywords: [ "fashion", "shopping_bags", "female" ], + "char": "\ud83d\udc5a", + fitzpatrick_scale: false, + category: "people" + }, + tshirt: { + keywords: [ "fashion", "cloth", "casual", "shirt", "tee" ], + "char": "\ud83d\udc55", + fitzpatrick_scale: false, + category: "people" + }, + jeans: { + keywords: [ "fashion", "shopping" ], + "char": "\ud83d\udc56", + fitzpatrick_scale: false, + category: "people" + }, + necktie: { + keywords: [ "shirt", "suitup", "formal", "fashion", "cloth", "business" ], + "char": "\ud83d\udc54", + fitzpatrick_scale: false, + category: "people" + }, + dress: { + keywords: [ "clothes", "fashion", "shopping" ], + "char": "\ud83d\udc57", + fitzpatrick_scale: false, + category: "people" + }, + bikini: { + keywords: [ "swimming", "female", "woman", "girl", "fashion", "beach", "summer" ], + "char": "\ud83d\udc59", + fitzpatrick_scale: false, + category: "people" + }, + kimono: { + keywords: [ "dress", "fashion", "women", "female", "japanese" ], + "char": "\ud83d\udc58", + fitzpatrick_scale: false, + category: "people" + }, + lipstick: { + keywords: [ "female", "girl", "fashion", "woman" ], + "char": "\ud83d\udc84", + fitzpatrick_scale: false, + category: "people" + }, + kiss: { + keywords: [ "face", "lips", "love", "like", "affection", "valentines" ], + "char": "\ud83d\udc8b", + fitzpatrick_scale: false, + category: "people" + }, + footprints: { + keywords: [ "feet", "tracking", "walking", "beach" ], + "char": "\ud83d\udc63", + fitzpatrick_scale: false, + category: "people" + }, + flat_shoe: { + keywords: [ "ballet", "slip-on", "slipper" ], + "char": "\ud83e\udd7f", + fitzpatrick_scale: false, + category: "people" + }, + high_heel: { + keywords: [ "fashion", "shoes", "female", "pumps", "stiletto" ], + "char": "\ud83d\udc60", + fitzpatrick_scale: false, + category: "people" + }, + sandal: { + keywords: [ "shoes", "fashion", "flip flops" ], + "char": "\ud83d\udc61", + fitzpatrick_scale: false, + category: "people" + }, + boot: { + keywords: [ "shoes", "fashion" ], + "char": "\ud83d\udc62", + fitzpatrick_scale: false, + category: "people" + }, + mans_shoe: { + keywords: [ "fashion", "male" ], + "char": "\ud83d\udc5e", + fitzpatrick_scale: false, + category: "people" + }, + athletic_shoe: { + keywords: [ "shoes", "sports", "sneakers" ], + "char": "\ud83d\udc5f", + fitzpatrick_scale: false, + category: "people" + }, + hiking_boot: { + keywords: [ "backpacking", "camping", "hiking" ], + "char": "\ud83e\udd7e", + fitzpatrick_scale: false, + category: "people" + }, + socks: { + keywords: [ "stockings", "clothes" ], + "char": "\ud83e\udde6", + fitzpatrick_scale: false, + category: "people" + }, + gloves: { + keywords: [ "hands", "winter", "clothes" ], + "char": "\ud83e\udde4", + fitzpatrick_scale: false, + category: "people" + }, + scarf: { + keywords: [ "neck", "winter", "clothes" ], + "char": "\ud83e\udde3", + fitzpatrick_scale: false, + category: "people" + }, + womans_hat: { + keywords: [ "fashion", "accessories", "female", "lady", "spring" ], + "char": "\ud83d\udc52", + fitzpatrick_scale: false, + category: "people" + }, + tophat: { + keywords: [ "magic", "gentleman", "classy", "circus" ], + "char": "\ud83c\udfa9", + fitzpatrick_scale: false, + category: "people" + }, + billed_hat: { + keywords: [ "cap", "baseball" ], + "char": "\ud83e\udde2", + fitzpatrick_scale: false, + category: "people" + }, + rescue_worker_helmet: { + keywords: [ "construction", "build" ], + "char": "\u26d1", + fitzpatrick_scale: false, + category: "people" + }, + mortar_board: { + keywords: [ "school", "college", "degree", "university", "graduation", "cap", "hat", "legal", "learn", "education" ], + "char": "\ud83c\udf93", + fitzpatrick_scale: false, + category: "people" + }, + crown: { + keywords: [ "king", "kod", "leader", "royalty", "lord" ], + "char": "\ud83d\udc51", + fitzpatrick_scale: false, + category: "people" + }, + school_satchel: { + keywords: [ "student", "education", "bag", "backpack" ], + "char": "\ud83c\udf92", + fitzpatrick_scale: false, + category: "people" + }, + luggage: { + keywords: [ "packing", "travel" ], + "char": "\ud83e\uddf3", + fitzpatrick_scale: false, + category: "people" + }, + pouch: { + keywords: [ "bag", "accessories", "shopping" ], + "char": "\ud83d\udc5d", + fitzpatrick_scale: false, + category: "people" + }, + purse: { + keywords: [ "fashion", "accessories", "money", "sales", "shopping" ], + "char": "\ud83d\udc5b", + fitzpatrick_scale: false, + category: "people" + }, + handbag: { + keywords: [ "fashion", "accessory", "accessories", "shopping" ], + "char": "\ud83d\udc5c", + fitzpatrick_scale: false, + category: "people" + }, + briefcase: { + keywords: [ "business", "documents", "work", "law", "legal", "job", "career" ], + "char": "\ud83d\udcbc", + fitzpatrick_scale: false, + category: "people" + }, + eyeglasses: { + keywords: [ "fashion", "accessories", "eyesight", "nerdy", "dork", "geek" ], + "char": "\ud83d\udc53", + fitzpatrick_scale: false, + category: "people" + }, + dark_sunglasses: { + keywords: [ "face", "cool", "accessories" ], + "char": "\ud83d\udd76", + fitzpatrick_scale: false, + category: "people" + }, + goggles: { + keywords: [ "eyes", "protection", "safety" ], + "char": "\ud83e\udd7d", + fitzpatrick_scale: false, + category: "people" + }, + ring: { + keywords: [ "wedding", "propose", "marriage", "valentines", "diamond", "fashion", "jewelry", "gem", "engagement" ], + "char": "\ud83d\udc8d", + fitzpatrick_scale: false, + category: "people" + }, + closed_umbrella: { + keywords: [ "weather", "rain", "drizzle" ], + "char": "\ud83c\udf02", + fitzpatrick_scale: false, + category: "people" + }, + dog: { + keywords: [ "animal", "friend", "nature", "woof", "puppy", "pet", "faithful" ], + "char": "\ud83d\udc36", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cat: { + keywords: [ "animal", "meow", "nature", "pet", "kitten" ], + "char": "\ud83d\udc31", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mouse: { + keywords: [ "animal", "nature", "cheese_wedge", "rodent" ], + "char": "\ud83d\udc2d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hamster: { + keywords: [ "animal", "nature" ], + "char": "\ud83d\udc39", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rabbit: { + keywords: [ "animal", "nature", "pet", "spring", "magic", "bunny" ], + "char": "\ud83d\udc30", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fox_face: { + keywords: [ "animal", "nature", "face" ], + "char": "\ud83e\udd8a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bear: { + keywords: [ "animal", "nature", "wild" ], + "char": "\ud83d\udc3b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + panda_face: { + keywords: [ "animal", "nature", "panda" ], + "char": "\ud83d\udc3c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + koala: { + keywords: [ "animal", "nature" ], + "char": "\ud83d\udc28", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tiger: { + keywords: [ "animal", "cat", "danger", "wild", "nature", "roar" ], + "char": "\ud83d\udc2f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lion: { + keywords: [ "animal", "nature" ], + "char": "\ud83e\udd81", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cow: { + keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ], + "char": "\ud83d\udc2e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig: { + keywords: [ "animal", "oink", "nature" ], + "char": "\ud83d\udc37", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig_nose: { + keywords: [ "animal", "oink" ], + "char": "\ud83d\udc3d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + frog: { + keywords: [ "animal", "nature", "croak", "toad" ], + "char": "\ud83d\udc38", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + squid: { + keywords: [ "animal", "nature", "ocean", "sea" ], + "char": "\ud83e\udd91", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + octopus: { + keywords: [ "animal", "creature", "ocean", "sea", "nature", "beach" ], + "char": "\ud83d\udc19", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shrimp: { + keywords: [ "animal", "ocean", "nature", "seafood" ], + "char": "\ud83e\udd90", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + monkey_face: { + keywords: [ "animal", "nature", "circus" ], + "char": "\ud83d\udc35", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + gorilla: { + keywords: [ "animal", "nature", "circus" ], + "char": "\ud83e\udd8d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + see_no_evil: { + keywords: [ "monkey", "animal", "nature", "haha" ], + "char": "\ud83d\ude48", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hear_no_evil: { + keywords: [ "animal", "monkey", "nature" ], + "char": "\ud83d\ude49", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + speak_no_evil: { + keywords: [ "monkey", "animal", "nature", "omg" ], + "char": "\ud83d\ude4a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + monkey: { + keywords: [ "animal", "nature", "banana", "circus" ], + "char": "\ud83d\udc12", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chicken: { + keywords: [ "animal", "cluck", "nature", "bird" ], + "char": "\ud83d\udc14", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + penguin: { + keywords: [ "animal", "nature" ], + "char": "\ud83d\udc27", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bird: { + keywords: [ "animal", "nature", "fly", "tweet", "spring" ], + "char": "\ud83d\udc26", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + baby_chick: { + keywords: [ "animal", "chicken", "bird" ], + "char": "\ud83d\udc24", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hatching_chick: { + keywords: [ "animal", "chicken", "egg", "born", "baby", "bird" ], + "char": "\ud83d\udc23", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hatched_chick: { + keywords: [ "animal", "chicken", "baby", "bird" ], + "char": "\ud83d\udc25", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + duck: { + keywords: [ "animal", "nature", "bird", "mallard" ], + "char": "\ud83e\udd86", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + eagle: { + keywords: [ "animal", "nature", "bird" ], + "char": "\ud83e\udd85", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + owl: { + keywords: [ "animal", "nature", "bird", "hoot" ], + "char": "\ud83e\udd89", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bat: { + keywords: [ "animal", "nature", "blind", "vampire" ], + "char": "\ud83e\udd87", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wolf: { + keywords: [ "animal", "nature", "wild" ], + "char": "\ud83d\udc3a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + boar: { + keywords: [ "animal", "nature" ], + "char": "\ud83d\udc17", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + horse: { + keywords: [ "animal", "brown", "nature" ], + "char": "\ud83d\udc34", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + unicorn: { + keywords: [ "animal", "nature", "mystical" ], + "char": "\ud83e\udd84", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + honeybee: { + keywords: [ "animal", "insect", "nature", "bug", "spring", "honey" ], + "char": "\ud83d\udc1d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bug: { + keywords: [ "animal", "insect", "nature", "worm" ], + "char": "\ud83d\udc1b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + butterfly: { + keywords: [ "animal", "insect", "nature", "caterpillar" ], + "char": "\ud83e\udd8b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snail: { + keywords: [ "slow", "animal", "shell" ], + "char": "\ud83d\udc0c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + beetle: { + keywords: [ "animal", "insect", "nature", "ladybug" ], + "char": "\ud83d\udc1e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ant: { + keywords: [ "animal", "insect", "nature", "bug" ], + "char": "\ud83d\udc1c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + grasshopper: { + keywords: [ "animal", "cricket", "chirp" ], + "char": "\ud83e\udd97", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + spider: { + keywords: [ "animal", "arachnid" ], + "char": "\ud83d\udd77", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + scorpion: { + keywords: [ "animal", "arachnid" ], + "char": "\ud83e\udd82", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crab: { + keywords: [ "animal", "crustacean" ], + "char": "\ud83e\udd80", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snake: { + keywords: [ "animal", "evil", "nature", "hiss", "python" ], + "char": "\ud83d\udc0d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lizard: { + keywords: [ "animal", "nature", "reptile" ], + "char": "\ud83e\udd8e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + "t-rex": { + keywords: [ "animal", "nature", "dinosaur", "tyrannosaurus", "extinct" ], + "char": "\ud83e\udd96", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sauropod: { + keywords: [ "animal", "nature", "dinosaur", "brachiosaurus", "brontosaurus", "diplodocus", "extinct" ], + "char": "\ud83e\udd95", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + turtle: { + keywords: [ "animal", "slow", "nature", "tortoise" ], + "char": "\ud83d\udc22", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tropical_fish: { + keywords: [ "animal", "swim", "ocean", "beach", "nemo" ], + "char": "\ud83d\udc20", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fish: { + keywords: [ "animal", "food", "nature" ], + "char": "\ud83d\udc1f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + blowfish: { + keywords: [ "animal", "nature", "food", "sea", "ocean" ], + "char": "\ud83d\udc21", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dolphin: { + keywords: [ "animal", "nature", "fish", "sea", "ocean", "flipper", "fins", "beach" ], + "char": "\ud83d\udc2c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shark: { + keywords: [ "animal", "nature", "fish", "sea", "ocean", "jaws", "fins", "beach" ], + "char": "\ud83e\udd88", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + whale: { + keywords: [ "animal", "nature", "sea", "ocean" ], + "char": "\ud83d\udc33", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + whale2: { + keywords: [ "animal", "nature", "sea", "ocean" ], + "char": "\ud83d\udc0b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crocodile: { + keywords: [ "animal", "nature", "reptile", "lizard", "alligator" ], + "char": "\ud83d\udc0a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + leopard: { + keywords: [ "animal", "nature" ], + "char": "\ud83d\udc06", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + zebra: { + keywords: [ "animal", "nature", "stripes", "safari" ], + "char": "\ud83e\udd93", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tiger2: { + keywords: [ "animal", "nature", "roar" ], + "char": "\ud83d\udc05", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + water_buffalo: { + keywords: [ "animal", "nature", "ox", "cow" ], + "char": "\ud83d\udc03", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ox: { + keywords: [ "animal", "cow", "beef" ], + "char": "\ud83d\udc02", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cow2: { + keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ], + "char": "\ud83d\udc04", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + deer: { + keywords: [ "animal", "nature", "horns", "venison" ], + "char": "\ud83e\udd8c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dromedary_camel: { + keywords: [ "animal", "hot", "desert", "hump" ], + "char": "\ud83d\udc2a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + camel: { + keywords: [ "animal", "nature", "hot", "desert", "hump" ], + "char": "\ud83d\udc2b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + giraffe: { + keywords: [ "animal", "nature", "spots", "safari" ], + "char": "\ud83e\udd92", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + elephant: { + keywords: [ "animal", "nature", "nose", "th", "circus" ], + "char": "\ud83d\udc18", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rhinoceros: { + keywords: [ "animal", "nature", "horn" ], + "char": "\ud83e\udd8f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + goat: { + keywords: [ "animal", "nature" ], + "char": "\ud83d\udc10", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ram: { + keywords: [ "animal", "sheep", "nature" ], + "char": "\ud83d\udc0f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sheep: { + keywords: [ "animal", "nature", "wool", "shipit" ], + "char": "\ud83d\udc11", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + racehorse: { + keywords: [ "animal", "gamble", "luck" ], + "char": "\ud83d\udc0e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig2: { + keywords: [ "animal", "nature" ], + "char": "\ud83d\udc16", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rat: { + keywords: [ "animal", "mouse", "rodent" ], + "char": "\ud83d\udc00", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mouse2: { + keywords: [ "animal", "nature", "rodent" ], + "char": "\ud83d\udc01", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rooster: { + keywords: [ "animal", "nature", "chicken" ], + "char": "\ud83d\udc13", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + turkey: { + keywords: [ "animal", "bird" ], + "char": "\ud83e\udd83", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dove: { + keywords: [ "animal", "bird" ], + "char": "\ud83d\udd4a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dog2: { + keywords: [ "animal", "nature", "friend", "doge", "pet", "faithful" ], + "char": "\ud83d\udc15", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + poodle: { + keywords: [ "dog", "animal", "101", "nature", "pet" ], + "char": "\ud83d\udc29", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cat2: { + keywords: [ "animal", "meow", "pet", "cats" ], + "char": "\ud83d\udc08", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rabbit2: { + keywords: [ "animal", "nature", "pet", "magic", "spring" ], + "char": "\ud83d\udc07", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chipmunk: { + keywords: [ "animal", "nature", "rodent", "squirrel" ], + "char": "\ud83d\udc3f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hedgehog: { + keywords: [ "animal", "nature", "spiny" ], + "char": "\ud83e\udd94", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + raccoon: { + keywords: [ "animal", "nature" ], + "char": "\ud83e\udd9d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + llama: { + keywords: [ "animal", "nature", "alpaca" ], + "char": "\ud83e\udd99", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hippopotamus: { + keywords: [ "animal", "nature" ], + "char": "\ud83e\udd9b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + kangaroo: { + keywords: [ "animal", "nature", "australia", "joey", "hop", "marsupial" ], + "char": "\ud83e\udd98", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + badger: { + keywords: [ "animal", "nature", "honey" ], + "char": "\ud83e\udda1", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + swan: { + keywords: [ "animal", "nature", "bird" ], + "char": "\ud83e\udda2", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + peacock: { + keywords: [ "animal", "nature", "peahen", "bird" ], + "char": "\ud83e\udd9a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + parrot: { + keywords: [ "animal", "nature", "bird", "pirate", "talk" ], + "char": "\ud83e\udd9c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lobster: { + keywords: [ "animal", "nature", "bisque", "claws", "seafood" ], + "char": "\ud83e\udd9e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mosquito: { + keywords: [ "animal", "nature", "insect", "malaria" ], + "char": "\ud83e\udd9f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + paw_prints: { + keywords: [ "animal", "tracking", "footprints", "dog", "cat", "pet", "feet" ], + "char": "\ud83d\udc3e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dragon: { + keywords: [ "animal", "myth", "nature", "chinese", "green" ], + "char": "\ud83d\udc09", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dragon_face: { + keywords: [ "animal", "myth", "nature", "chinese", "green" ], + "char": "\ud83d\udc32", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cactus: { + keywords: [ "vegetable", "plant", "nature" ], + "char": "\ud83c\udf35", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + christmas_tree: { + keywords: [ "festival", "vacation", "december", "xmas", "celebration" ], + "char": "\ud83c\udf84", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + evergreen_tree: { + keywords: [ "plant", "nature" ], + "char": "\ud83c\udf32", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + deciduous_tree: { + keywords: [ "plant", "nature" ], + "char": "\ud83c\udf33", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + palm_tree: { + keywords: [ "plant", "vegetable", "nature", "summer", "beach", "mojito", "tropical" ], + "char": "\ud83c\udf34", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + seedling: { + keywords: [ "plant", "nature", "grass", "lawn", "spring" ], + "char": "\ud83c\udf31", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + herb: { + keywords: [ "vegetable", "plant", "medicine", "weed", "grass", "lawn" ], + "char": "\ud83c\udf3f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shamrock: { + keywords: [ "vegetable", "plant", "nature", "irish", "clover" ], + "char": "\u2618", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + four_leaf_clover: { + keywords: [ "vegetable", "plant", "nature", "lucky", "irish" ], + "char": "\ud83c\udf40", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bamboo: { + keywords: [ "plant", "nature", "vegetable", "panda", "pine_decoration" ], + "char": "\ud83c\udf8d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tanabata_tree: { + keywords: [ "plant", "nature", "branch", "summer" ], + "char": "\ud83c\udf8b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + leaves: { + keywords: [ "nature", "plant", "tree", "vegetable", "grass", "lawn", "spring" ], + "char": "\ud83c\udf43", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fallen_leaf: { + keywords: [ "nature", "plant", "vegetable", "leaves" ], + "char": "\ud83c\udf42", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + maple_leaf: { + keywords: [ "nature", "plant", "vegetable", "ca", "fall" ], + "char": "\ud83c\udf41", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ear_of_rice: { + keywords: [ "nature", "plant" ], + "char": "\ud83c\udf3e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hibiscus: { + keywords: [ "plant", "vegetable", "flowers", "beach" ], + "char": "\ud83c\udf3a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sunflower: { + keywords: [ "nature", "plant", "fall" ], + "char": "\ud83c\udf3b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rose: { + keywords: [ "flowers", "valentines", "love", "spring" ], + "char": "\ud83c\udf39", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wilted_flower: { + keywords: [ "plant", "nature", "flower" ], + "char": "\ud83e\udd40", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tulip: { + keywords: [ "flowers", "plant", "nature", "summer", "spring" ], + "char": "\ud83c\udf37", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + blossom: { + keywords: [ "nature", "flowers", "yellow" ], + "char": "\ud83c\udf3c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cherry_blossom: { + keywords: [ "nature", "plant", "spring", "flower" ], + "char": "\ud83c\udf38", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bouquet: { + keywords: [ "flowers", "nature", "spring" ], + "char": "\ud83d\udc90", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mushroom: { + keywords: [ "plant", "vegetable" ], + "char": "\ud83c\udf44", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chestnut: { + keywords: [ "food", "squirrel" ], + "char": "\ud83c\udf30", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + jack_o_lantern: { + keywords: [ "halloween", "light", "pumpkin", "creepy", "fall" ], + "char": "\ud83c\udf83", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shell: { + keywords: [ "nature", "sea", "beach" ], + "char": "\ud83d\udc1a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + spider_web: { + keywords: [ "animal", "insect", "arachnid", "silk" ], + "char": "\ud83d\udd78", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_americas: { + keywords: [ "globe", "world", "USA", "international" ], + "char": "\ud83c\udf0e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_africa: { + keywords: [ "globe", "world", "international" ], + "char": "\ud83c\udf0d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_asia: { + keywords: [ "globe", "world", "east", "international" ], + "char": "\ud83c\udf0f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + full_moon: { + keywords: [ "nature", "yellow", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": "\ud83c\udf15", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waning_gibbous_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep", "waxing_gibbous_moon" ], + "char": "\ud83c\udf16", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + last_quarter_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": "\ud83c\udf17", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waning_crescent_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": "\ud83c\udf18", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + new_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": "\ud83c\udf11", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waxing_crescent_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": "\ud83c\udf12", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + first_quarter_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": "\ud83c\udf13", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waxing_gibbous_moon: { + keywords: [ "nature", "night", "sky", "gray", "twilight", "planet", "space", "evening", "sleep" ], + "char": "\ud83c\udf14", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + new_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": "\ud83c\udf1a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + full_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": "\ud83c\udf1d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + first_quarter_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": "\ud83c\udf1b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + last_quarter_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + "char": "\ud83c\udf1c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_with_face: { + keywords: [ "nature", "morning", "sky" ], + "char": "\ud83c\udf1e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crescent_moon: { + keywords: [ "night", "sleep", "sky", "evening", "magic" ], + "char": "\ud83c\udf19", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + star: { + keywords: [ "night", "yellow" ], + "char": "\u2b50", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + star2: { + keywords: [ "night", "sparkle", "awesome", "good", "magic" ], + "char": "\ud83c\udf1f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dizzy: { + keywords: [ "star", "sparkle", "shoot", "magic" ], + "char": "\ud83d\udcab", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sparkles: { + keywords: [ "stars", "shine", "shiny", "cool", "awesome", "good", "magic" ], + "char": "\u2728", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + comet: { + keywords: [ "space" ], + "char": "\u2604", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sunny: { + keywords: [ "weather", "nature", "brightness", "summer", "beach", "spring" ], + "char": "\u2600\ufe0f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_small_cloud: { + keywords: [ "weather" ], + "char": "\ud83c\udf24", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + partly_sunny: { + keywords: [ "weather", "nature", "cloudy", "morning", "fall", "spring" ], + "char": "\u26c5", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_large_cloud: { + keywords: [ "weather" ], + "char": "\ud83c\udf25", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_rain_cloud: { + keywords: [ "weather" ], + "char": "\ud83c\udf26", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud: { + keywords: [ "weather", "sky" ], + "char": "\u2601\ufe0f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_rain: { + keywords: [ "weather" ], + "char": "\ud83c\udf27", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_lightning_and_rain: { + keywords: [ "weather", "lightning" ], + "char": "\u26c8", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_lightning: { + keywords: [ "weather", "thunder" ], + "char": "\ud83c\udf29", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + zap: { + keywords: [ "thunder", "weather", "lightning bolt", "fast" ], + "char": "\u26a1", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fire: { + keywords: [ "hot", "cook", "flame" ], + "char": "\ud83d\udd25", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + boom: { + keywords: [ "bomb", "explode", "explosion", "collision", "blown" ], + "char": "\ud83d\udca5", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowflake: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas" ], + "char": "\u2744\ufe0f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_snow: { + keywords: [ "weather" ], + "char": "\ud83c\udf28", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowman: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen", "without_snow" ], + "char": "\u26c4", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowman_with_snow: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen" ], + "char": "\u2603", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wind_face: { + keywords: [ "gust", "air" ], + "char": "\ud83c\udf2c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dash: { + keywords: [ "wind", "air", "fast", "shoo", "fart", "smoke", "puff" ], + "char": "\ud83d\udca8", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tornado: { + keywords: [ "weather", "cyclone", "twister" ], + "char": "\ud83c\udf2a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fog: { + keywords: [ "weather" ], + "char": "\ud83c\udf2b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + open_umbrella: { + keywords: [ "weather", "spring" ], + "char": "\u2602", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + umbrella: { + keywords: [ "rainy", "weather", "spring" ], + "char": "\u2614", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + droplet: { + keywords: [ "water", "drip", "faucet", "spring" ], + "char": "\ud83d\udca7", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sweat_drops: { + keywords: [ "water", "drip", "oops" ], + "char": "\ud83d\udca6", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ocean: { + keywords: [ "sea", "water", "wave", "nature", "tsunami", "disaster" ], + "char": "\ud83c\udf0a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + green_apple: { + keywords: [ "fruit", "nature" ], + "char": "\ud83c\udf4f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + apple: { + keywords: [ "fruit", "mac", "school" ], + "char": "\ud83c\udf4e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pear: { + keywords: [ "fruit", "nature", "food" ], + "char": "\ud83c\udf50", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tangerine: { + keywords: [ "food", "fruit", "nature", "orange" ], + "char": "\ud83c\udf4a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + lemon: { + keywords: [ "fruit", "nature" ], + "char": "\ud83c\udf4b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + banana: { + keywords: [ "fruit", "food", "monkey" ], + "char": "\ud83c\udf4c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + watermelon: { + keywords: [ "fruit", "food", "picnic", "summer" ], + "char": "\ud83c\udf49", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + grapes: { + keywords: [ "fruit", "food", "wine" ], + "char": "\ud83c\udf47", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + strawberry: { + keywords: [ "fruit", "food", "nature" ], + "char": "\ud83c\udf53", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + melon: { + keywords: [ "fruit", "nature", "food" ], + "char": "\ud83c\udf48", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cherries: { + keywords: [ "food", "fruit" ], + "char": "\ud83c\udf52", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + peach: { + keywords: [ "fruit", "nature", "food" ], + "char": "\ud83c\udf51", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pineapple: { + keywords: [ "fruit", "nature", "food" ], + "char": "\ud83c\udf4d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + coconut: { + keywords: [ "fruit", "nature", "food", "palm" ], + "char": "\ud83e\udd65", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + kiwi_fruit: { + keywords: [ "fruit", "food" ], + "char": "\ud83e\udd5d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + mango: { + keywords: [ "fruit", "food", "tropical" ], + "char": "\ud83e\udd6d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + avocado: { + keywords: [ "fruit", "food" ], + "char": "\ud83e\udd51", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + broccoli: { + keywords: [ "fruit", "food", "vegetable" ], + "char": "\ud83e\udd66", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tomato: { + keywords: [ "fruit", "vegetable", "nature", "food" ], + "char": "\ud83c\udf45", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + eggplant: { + keywords: [ "vegetable", "nature", "food", "aubergine" ], + "char": "\ud83c\udf46", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cucumber: { + keywords: [ "fruit", "food", "pickle" ], + "char": "\ud83e\udd52", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + carrot: { + keywords: [ "vegetable", "food", "orange" ], + "char": "\ud83e\udd55", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hot_pepper: { + keywords: [ "food", "spicy", "chilli", "chili" ], + "char": "\ud83c\udf36", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + potato: { + keywords: [ "food", "tuber", "vegatable", "starch" ], + "char": "\ud83e\udd54", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + corn: { + keywords: [ "food", "vegetable", "plant" ], + "char": "\ud83c\udf3d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + leafy_greens: { + keywords: [ "food", "vegetable", "plant", "bok choy", "cabbage", "kale", "lettuce" ], + "char": "\ud83e\udd6c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sweet_potato: { + keywords: [ "food", "nature" ], + "char": "\ud83c\udf60", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + peanuts: { + keywords: [ "food", "nut" ], + "char": "\ud83e\udd5c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + honey_pot: { + keywords: [ "bees", "sweet", "kitchen" ], + "char": "\ud83c\udf6f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + croissant: { + keywords: [ "food", "bread", "french" ], + "char": "\ud83e\udd50", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bread: { + keywords: [ "food", "wheat", "breakfast", "toast" ], + "char": "\ud83c\udf5e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + baguette_bread: { + keywords: [ "food", "bread", "french" ], + "char": "\ud83e\udd56", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bagel: { + keywords: [ "food", "bread", "bakery", "schmear" ], + "char": "\ud83e\udd6f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pretzel: { + keywords: [ "food", "bread", "twisted" ], + "char": "\ud83e\udd68", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cheese: { + keywords: [ "food", "chadder" ], + "char": "\ud83e\uddc0", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + egg: { + keywords: [ "food", "chicken", "breakfast" ], + "char": "\ud83e\udd5a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bacon: { + keywords: [ "food", "breakfast", "pork", "pig", "meat" ], + "char": "\ud83e\udd53", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + steak: { + keywords: [ "food", "cow", "meat", "cut", "chop", "lambchop", "porkchop" ], + "char": "\ud83e\udd69", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pancakes: { + keywords: [ "food", "breakfast", "flapjacks", "hotcakes" ], + "char": "\ud83e\udd5e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + poultry_leg: { + keywords: [ "food", "meat", "drumstick", "bird", "chicken", "turkey" ], + "char": "\ud83c\udf57", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + meat_on_bone: { + keywords: [ "good", "food", "drumstick" ], + "char": "\ud83c\udf56", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bone: { + keywords: [ "skeleton" ], + "char": "\ud83e\uddb4", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fried_shrimp: { + keywords: [ "food", "animal", "appetizer", "summer" ], + "char": "\ud83c\udf64", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fried_egg: { + keywords: [ "food", "breakfast", "kitchen", "egg" ], + "char": "\ud83c\udf73", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hamburger: { + keywords: [ "meat", "fast food", "beef", "cheeseburger", "mcdonalds", "burger king" ], + "char": "\ud83c\udf54", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fries: { + keywords: [ "chips", "snack", "fast food" ], + "char": "\ud83c\udf5f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + stuffed_flatbread: { + keywords: [ "food", "flatbread", "stuffed", "gyro" ], + "char": "\ud83e\udd59", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hotdog: { + keywords: [ "food", "frankfurter" ], + "char": "\ud83c\udf2d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pizza: { + keywords: [ "food", "party" ], + "char": "\ud83c\udf55", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sandwich: { + keywords: [ "food", "lunch", "bread" ], + "char": "\ud83e\udd6a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + canned_food: { + keywords: [ "food", "soup" ], + "char": "\ud83e\udd6b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + spaghetti: { + keywords: [ "food", "italian", "noodle" ], + "char": "\ud83c\udf5d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + taco: { + keywords: [ "food", "mexican" ], + "char": "\ud83c\udf2e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + burrito: { + keywords: [ "food", "mexican" ], + "char": "\ud83c\udf2f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + green_salad: { + keywords: [ "food", "healthy", "lettuce" ], + "char": "\ud83e\udd57", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + shallow_pan_of_food: { + keywords: [ "food", "cooking", "casserole", "paella" ], + "char": "\ud83e\udd58", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + ramen: { + keywords: [ "food", "japanese", "noodle", "chopsticks" ], + "char": "\ud83c\udf5c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + stew: { + keywords: [ "food", "meat", "soup" ], + "char": "\ud83c\udf72", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fish_cake: { + keywords: [ "food", "japan", "sea", "beach", "narutomaki", "pink", "swirl", "kamaboko", "surimi", "ramen" ], + "char": "\ud83c\udf65", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fortune_cookie: { + keywords: [ "food", "prophecy" ], + "char": "\ud83e\udd60", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sushi: { + keywords: [ "food", "fish", "japanese", "rice" ], + "char": "\ud83c\udf63", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bento: { + keywords: [ "food", "japanese", "box" ], + "char": "\ud83c\udf71", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + curry: { + keywords: [ "food", "spicy", "hot", "indian" ], + "char": "\ud83c\udf5b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice_ball: { + keywords: [ "food", "japanese" ], + "char": "\ud83c\udf59", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice: { + keywords: [ "food", "china", "asian" ], + "char": "\ud83c\udf5a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice_cracker: { + keywords: [ "food", "japanese" ], + "char": "\ud83c\udf58", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + oden: { + keywords: [ "food", "japanese" ], + "char": "\ud83c\udf62", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + dango: { + keywords: [ "food", "dessert", "sweet", "japanese", "barbecue", "meat" ], + "char": "\ud83c\udf61", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + shaved_ice: { + keywords: [ "hot", "dessert", "summer" ], + "char": "\ud83c\udf67", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + ice_cream: { + keywords: [ "food", "hot", "dessert" ], + "char": "\ud83c\udf68", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + icecream: { + keywords: [ "food", "hot", "dessert", "summer" ], + "char": "\ud83c\udf66", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pie: { + keywords: [ "food", "dessert", "pastry" ], + "char": "\ud83e\udd67", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cake: { + keywords: [ "food", "dessert" ], + "char": "\ud83c\udf70", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cupcake: { + keywords: [ "food", "dessert", "bakery", "sweet" ], + "char": "\ud83e\uddc1", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + moon_cake: { + keywords: [ "food", "autumn" ], + "char": "\ud83e\udd6e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + birthday: { + keywords: [ "food", "dessert", "cake" ], + "char": "\ud83c\udf82", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + custard: { + keywords: [ "dessert", "food" ], + "char": "\ud83c\udf6e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + candy: { + keywords: [ "snack", "dessert", "sweet", "lolly" ], + "char": "\ud83c\udf6c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + lollipop: { + keywords: [ "food", "snack", "candy", "sweet" ], + "char": "\ud83c\udf6d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + chocolate_bar: { + keywords: [ "food", "snack", "dessert", "sweet" ], + "char": "\ud83c\udf6b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + popcorn: { + keywords: [ "food", "movie theater", "films", "snack" ], + "char": "\ud83c\udf7f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + dumpling: { + keywords: [ "food", "empanada", "pierogi", "potsticker" ], + "char": "\ud83e\udd5f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + doughnut: { + keywords: [ "food", "dessert", "snack", "sweet", "donut" ], + "char": "\ud83c\udf69", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cookie: { + keywords: [ "food", "snack", "oreo", "chocolate", "sweet", "dessert" ], + "char": "\ud83c\udf6a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + milk_glass: { + keywords: [ "beverage", "drink", "cow" ], + "char": "\ud83e\udd5b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + beer: { + keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ], + "char": "\ud83c\udf7a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + beers: { + keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ], + "char": "\ud83c\udf7b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + clinking_glasses: { + keywords: [ "beverage", "drink", "party", "alcohol", "celebrate", "cheers", "wine", "champagne", "toast" ], + "char": "\ud83e\udd42", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + wine_glass: { + keywords: [ "drink", "beverage", "drunk", "alcohol", "booze" ], + "char": "\ud83c\udf77", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tumbler_glass: { + keywords: [ "drink", "beverage", "drunk", "alcohol", "liquor", "booze", "bourbon", "scotch", "whisky", "glass", "shot" ], + "char": "\ud83e\udd43", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cocktail: { + keywords: [ "drink", "drunk", "alcohol", "beverage", "booze", "mojito" ], + "char": "\ud83c\udf78", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tropical_drink: { + keywords: [ "beverage", "cocktail", "summer", "beach", "alcohol", "booze", "mojito" ], + "char": "\ud83c\udf79", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + champagne: { + keywords: [ "drink", "wine", "bottle", "celebration" ], + "char": "\ud83c\udf7e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sake: { + keywords: [ "wine", "drink", "drunk", "beverage", "japanese", "alcohol", "booze" ], + "char": "\ud83c\udf76", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tea: { + keywords: [ "drink", "bowl", "breakfast", "green", "british" ], + "char": "\ud83c\udf75", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cup_with_straw: { + keywords: [ "drink", "soda" ], + "char": "\ud83e\udd64", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + coffee: { + keywords: [ "beverage", "caffeine", "latte", "espresso" ], + "char": "\u2615", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + baby_bottle: { + keywords: [ "food", "container", "milk" ], + "char": "\ud83c\udf7c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + salt: { + keywords: [ "condiment", "shaker" ], + "char": "\ud83e\uddc2", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + spoon: { + keywords: [ "cutlery", "kitchen", "tableware" ], + "char": "\ud83e\udd44", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fork_and_knife: { + keywords: [ "cutlery", "kitchen" ], + "char": "\ud83c\udf74", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + plate_with_cutlery: { + keywords: [ "food", "eat", "meal", "lunch", "dinner", "restaurant" ], + "char": "\ud83c\udf7d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bowl_with_spoon: { + keywords: [ "food", "breakfast", "cereal", "oatmeal", "porridge" ], + "char": "\ud83e\udd63", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + takeout_box: { + keywords: [ "food", "leftovers" ], + "char": "\ud83e\udd61", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + chopsticks: { + keywords: [ "food" ], + "char": "\ud83e\udd62", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + soccer: { + keywords: [ "sports", "football" ], + "char": "\u26bd", + fitzpatrick_scale: false, + category: "activity" + }, + basketball: { + keywords: [ "sports", "balls", "NBA" ], + "char": "\ud83c\udfc0", + fitzpatrick_scale: false, + category: "activity" + }, + football: { + keywords: [ "sports", "balls", "NFL" ], + "char": "\ud83c\udfc8", + fitzpatrick_scale: false, + category: "activity" + }, + baseball: { + keywords: [ "sports", "balls" ], + "char": "\u26be", + fitzpatrick_scale: false, + category: "activity" + }, + softball: { + keywords: [ "sports", "balls" ], + "char": "\ud83e\udd4e", + fitzpatrick_scale: false, + category: "activity" + }, + tennis: { + keywords: [ "sports", "balls", "green" ], + "char": "\ud83c\udfbe", + fitzpatrick_scale: false, + category: "activity" + }, + volleyball: { + keywords: [ "sports", "balls" ], + "char": "\ud83c\udfd0", + fitzpatrick_scale: false, + category: "activity" + }, + rugby_football: { + keywords: [ "sports", "team" ], + "char": "\ud83c\udfc9", + fitzpatrick_scale: false, + category: "activity" + }, + flying_disc: { + keywords: [ "sports", "frisbee", "ultimate" ], + "char": "\ud83e\udd4f", + fitzpatrick_scale: false, + category: "activity" + }, + "8ball": { + keywords: [ "pool", "hobby", "game", "luck", "magic" ], + "char": "\ud83c\udfb1", + fitzpatrick_scale: false, + category: "activity" + }, + golf: { + keywords: [ "sports", "business", "flag", "hole", "summer" ], + "char": "\u26f3", + fitzpatrick_scale: false, + category: "activity" + }, + golfing_woman: { + keywords: [ "sports", "business", "woman", "female" ], + "char": "\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f", + fitzpatrick_scale: false, + category: "activity" + }, + golfing_man: { + keywords: [ "sports", "business" ], + "char": "\ud83c\udfcc", + fitzpatrick_scale: true, + category: "activity" + }, + ping_pong: { + keywords: [ "sports", "pingpong" ], + "char": "\ud83c\udfd3", + fitzpatrick_scale: false, + category: "activity" + }, + badminton: { + keywords: [ "sports" ], + "char": "\ud83c\udff8", + fitzpatrick_scale: false, + category: "activity" + }, + goal_net: { + keywords: [ "sports" ], + "char": "\ud83e\udd45", + fitzpatrick_scale: false, + category: "activity" + }, + ice_hockey: { + keywords: [ "sports" ], + "char": "\ud83c\udfd2", + fitzpatrick_scale: false, + category: "activity" + }, + field_hockey: { + keywords: [ "sports" ], + "char": "\ud83c\udfd1", + fitzpatrick_scale: false, + category: "activity" + }, + lacrosse: { + keywords: [ "sports", "ball", "stick" ], + "char": "\ud83e\udd4d", + fitzpatrick_scale: false, + category: "activity" + }, + cricket: { + keywords: [ "sports" ], + "char": "\ud83c\udfcf", + fitzpatrick_scale: false, + category: "activity" + }, + ski: { + keywords: [ "sports", "winter", "cold", "snow" ], + "char": "\ud83c\udfbf", + fitzpatrick_scale: false, + category: "activity" + }, + skier: { + keywords: [ "sports", "winter", "snow" ], + "char": "\u26f7", + fitzpatrick_scale: false, + category: "activity" + }, + snowboarder: { + keywords: [ "sports", "winter" ], + "char": "\ud83c\udfc2", + fitzpatrick_scale: true, + category: "activity" + }, + person_fencing: { + keywords: [ "sports", "fencing", "sword" ], + "char": "\ud83e\udd3a", + fitzpatrick_scale: false, + category: "activity" + }, + women_wrestling: { + keywords: [ "sports", "wrestlers" ], + "char": "\ud83e\udd3c\u200d\u2640\ufe0f", + fitzpatrick_scale: false, + category: "activity" + }, + men_wrestling: { + keywords: [ "sports", "wrestlers" ], + "char": "\ud83e\udd3c\u200d\u2642\ufe0f", + fitzpatrick_scale: false, + category: "activity" + }, + woman_cartwheeling: { + keywords: [ "gymnastics" ], + "char": "\ud83e\udd38\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + man_cartwheeling: { + keywords: [ "gymnastics" ], + "char": "\ud83e\udd38\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + woman_playing_handball: { + keywords: [ "sports" ], + "char": "\ud83e\udd3e\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + man_playing_handball: { + keywords: [ "sports" ], + "char": "\ud83e\udd3e\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + ice_skate: { + keywords: [ "sports" ], + "char": "\u26f8", + fitzpatrick_scale: false, + category: "activity" + }, + curling_stone: { + keywords: [ "sports" ], + "char": "\ud83e\udd4c", + fitzpatrick_scale: false, + category: "activity" + }, + skateboard: { + keywords: [ "board" ], + "char": "\ud83d\udef9", + fitzpatrick_scale: false, + category: "activity" + }, + sled: { + keywords: [ "sleigh", "luge", "toboggan" ], + "char": "\ud83d\udef7", + fitzpatrick_scale: false, + category: "activity" + }, + bow_and_arrow: { + keywords: [ "sports" ], + "char": "\ud83c\udff9", + fitzpatrick_scale: false, + category: "activity" + }, + fishing_pole_and_fish: { + keywords: [ "food", "hobby", "summer" ], + "char": "\ud83c\udfa3", + fitzpatrick_scale: false, + category: "activity" + }, + boxing_glove: { + keywords: [ "sports", "fighting" ], + "char": "\ud83e\udd4a", + fitzpatrick_scale: false, + category: "activity" + }, + martial_arts_uniform: { + keywords: [ "judo", "karate", "taekwondo" ], + "char": "\ud83e\udd4b", + fitzpatrick_scale: false, + category: "activity" + }, + rowing_woman: { + keywords: [ "sports", "hobby", "water", "ship", "woman", "female" ], + "char": "\ud83d\udea3\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + rowing_man: { + keywords: [ "sports", "hobby", "water", "ship" ], + "char": "\ud83d\udea3", + fitzpatrick_scale: true, + category: "activity" + }, + climbing_woman: { + keywords: [ "sports", "hobby", "woman", "female", "rock" ], + "char": "\ud83e\uddd7\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + climbing_man: { + keywords: [ "sports", "hobby", "man", "male", "rock" ], + "char": "\ud83e\uddd7\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + swimming_woman: { + keywords: [ "sports", "exercise", "human", "athlete", "water", "summer", "woman", "female" ], + "char": "\ud83c\udfca\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + swimming_man: { + keywords: [ "sports", "exercise", "human", "athlete", "water", "summer" ], + "char": "\ud83c\udfca", + fitzpatrick_scale: true, + category: "activity" + }, + woman_playing_water_polo: { + keywords: [ "sports", "pool" ], + "char": "\ud83e\udd3d\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + man_playing_water_polo: { + keywords: [ "sports", "pool" ], + "char": "\ud83e\udd3d\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + woman_in_lotus_position: { + keywords: [ "woman", "female", "meditation", "yoga", "serenity", "zen", "mindfulness" ], + "char": "\ud83e\uddd8\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + man_in_lotus_position: { + keywords: [ "man", "male", "meditation", "yoga", "serenity", "zen", "mindfulness" ], + "char": "\ud83e\uddd8\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + surfing_woman: { + keywords: [ "sports", "ocean", "sea", "summer", "beach", "woman", "female" ], + "char": "\ud83c\udfc4\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + surfing_man: { + keywords: [ "sports", "ocean", "sea", "summer", "beach" ], + "char": "\ud83c\udfc4", + fitzpatrick_scale: true, + category: "activity" + }, + bath: { + keywords: [ "clean", "shower", "bathroom" ], + "char": "\ud83d\udec0", + fitzpatrick_scale: true, + category: "activity" + }, + basketball_woman: { + keywords: [ "sports", "human", "woman", "female" ], + "char": "\u26f9\ufe0f\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + basketball_man: { + keywords: [ "sports", "human" ], + "char": "\u26f9", + fitzpatrick_scale: true, + category: "activity" + }, + weight_lifting_woman: { + keywords: [ "sports", "training", "exercise", "woman", "female" ], + "char": "\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + weight_lifting_man: { + keywords: [ "sports", "training", "exercise" ], + "char": "\ud83c\udfcb", + fitzpatrick_scale: true, + category: "activity" + }, + biking_woman: { + keywords: [ "sports", "bike", "exercise", "hipster", "woman", "female" ], + "char": "\ud83d\udeb4\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + biking_man: { + keywords: [ "sports", "bike", "exercise", "hipster" ], + "char": "\ud83d\udeb4", + fitzpatrick_scale: true, + category: "activity" + }, + mountain_biking_woman: { + keywords: [ "transportation", "sports", "human", "race", "bike", "woman", "female" ], + "char": "\ud83d\udeb5\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + mountain_biking_man: { + keywords: [ "transportation", "sports", "human", "race", "bike" ], + "char": "\ud83d\udeb5", + fitzpatrick_scale: true, + category: "activity" + }, + horse_racing: { + keywords: [ "animal", "betting", "competition", "gambling", "luck" ], + "char": "\ud83c\udfc7", + fitzpatrick_scale: true, + category: "activity" + }, + business_suit_levitating: { + keywords: [ "suit", "business", "levitate", "hover", "jump" ], + "char": "\ud83d\udd74", + fitzpatrick_scale: true, + category: "activity" + }, + trophy: { + keywords: [ "win", "award", "contest", "place", "ftw", "ceremony" ], + "char": "\ud83c\udfc6", + fitzpatrick_scale: false, + category: "activity" + }, + running_shirt_with_sash: { + keywords: [ "play", "pageant" ], + "char": "\ud83c\udfbd", + fitzpatrick_scale: false, + category: "activity" + }, + medal_sports: { + keywords: [ "award", "winning" ], + "char": "\ud83c\udfc5", + fitzpatrick_scale: false, + category: "activity" + }, + medal_military: { + keywords: [ "award", "winning", "army" ], + "char": "\ud83c\udf96", + fitzpatrick_scale: false, + category: "activity" + }, + "1st_place_medal": { + keywords: [ "award", "winning", "first" ], + "char": "\ud83e\udd47", + fitzpatrick_scale: false, + category: "activity" + }, + "2nd_place_medal": { + keywords: [ "award", "second" ], + "char": "\ud83e\udd48", + fitzpatrick_scale: false, + category: "activity" + }, + "3rd_place_medal": { + keywords: [ "award", "third" ], + "char": "\ud83e\udd49", + fitzpatrick_scale: false, + category: "activity" + }, + reminder_ribbon: { + keywords: [ "sports", "cause", "support", "awareness" ], + "char": "\ud83c\udf97", + fitzpatrick_scale: false, + category: "activity" + }, + rosette: { + keywords: [ "flower", "decoration", "military" ], + "char": "\ud83c\udff5", + fitzpatrick_scale: false, + category: "activity" + }, + ticket: { + keywords: [ "event", "concert", "pass" ], + "char": "\ud83c\udfab", + fitzpatrick_scale: false, + category: "activity" + }, + tickets: { + keywords: [ "sports", "concert", "entrance" ], + "char": "\ud83c\udf9f", + fitzpatrick_scale: false, + category: "activity" + }, + performing_arts: { + keywords: [ "acting", "theater", "drama" ], + "char": "\ud83c\udfad", + fitzpatrick_scale: false, + category: "activity" + }, + art: { + keywords: [ "design", "paint", "draw", "colors" ], + "char": "\ud83c\udfa8", + fitzpatrick_scale: false, + category: "activity" + }, + circus_tent: { + keywords: [ "festival", "carnival", "party" ], + "char": "\ud83c\udfaa", + fitzpatrick_scale: false, + category: "activity" + }, + woman_juggling: { + keywords: [ "juggle", "balance", "skill", "multitask" ], + "char": "\ud83e\udd39\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + man_juggling: { + keywords: [ "juggle", "balance", "skill", "multitask" ], + "char": "\ud83e\udd39\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + microphone: { + keywords: [ "sound", "music", "PA", "sing", "talkshow" ], + "char": "\ud83c\udfa4", + fitzpatrick_scale: false, + category: "activity" + }, + headphones: { + keywords: [ "music", "score", "gadgets" ], + "char": "\ud83c\udfa7", + fitzpatrick_scale: false, + category: "activity" + }, + musical_score: { + keywords: [ "treble", "clef", "compose" ], + "char": "\ud83c\udfbc", + fitzpatrick_scale: false, + category: "activity" + }, + musical_keyboard: { + keywords: [ "piano", "instrument", "compose" ], + "char": "\ud83c\udfb9", + fitzpatrick_scale: false, + category: "activity" + }, + drum: { + keywords: [ "music", "instrument", "drumsticks", "snare" ], + "char": "\ud83e\udd41", + fitzpatrick_scale: false, + category: "activity" + }, + saxophone: { + keywords: [ "music", "instrument", "jazz", "blues" ], + "char": "\ud83c\udfb7", + fitzpatrick_scale: false, + category: "activity" + }, + trumpet: { + keywords: [ "music", "brass" ], + "char": "\ud83c\udfba", + fitzpatrick_scale: false, + category: "activity" + }, + guitar: { + keywords: [ "music", "instrument" ], + "char": "\ud83c\udfb8", + fitzpatrick_scale: false, + category: "activity" + }, + violin: { + keywords: [ "music", "instrument", "orchestra", "symphony" ], + "char": "\ud83c\udfbb", + fitzpatrick_scale: false, + category: "activity" + }, + clapper: { + keywords: [ "movie", "film", "record" ], + "char": "\ud83c\udfac", + fitzpatrick_scale: false, + category: "activity" + }, + video_game: { + keywords: [ "play", "console", "PS4", "controller" ], + "char": "\ud83c\udfae", + fitzpatrick_scale: false, + category: "activity" + }, + space_invader: { + keywords: [ "game", "arcade", "play" ], + "char": "\ud83d\udc7e", + fitzpatrick_scale: false, + category: "activity" + }, + dart: { + keywords: [ "game", "play", "bar", "target", "bullseye" ], + "char": "\ud83c\udfaf", + fitzpatrick_scale: false, + category: "activity" + }, + game_die: { + keywords: [ "dice", "random", "tabletop", "play", "luck" ], + "char": "\ud83c\udfb2", + fitzpatrick_scale: false, + category: "activity" + }, + chess_pawn: { + keywords: [ "expendable" ], + "char": "\u265f", + fitzpatrick_scale: false, + category: "activity" + }, + slot_machine: { + keywords: [ "bet", "gamble", "vegas", "fruit machine", "luck", "casino" ], + "char": "\ud83c\udfb0", + fitzpatrick_scale: false, + category: "activity" + }, + jigsaw: { + keywords: [ "interlocking", "puzzle", "piece" ], + "char": "\ud83e\udde9", + fitzpatrick_scale: false, + category: "activity" + }, + bowling: { + keywords: [ "sports", "fun", "play" ], + "char": "\ud83c\udfb3", + fitzpatrick_scale: false, + category: "activity" + }, + red_car: { + keywords: [ "red", "transportation", "vehicle" ], + "char": "\ud83d\ude97", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + taxi: { + keywords: [ "uber", "vehicle", "cars", "transportation" ], + "char": "\ud83d\ude95", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + blue_car: { + keywords: [ "transportation", "vehicle" ], + "char": "\ud83d\ude99", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bus: { + keywords: [ "car", "vehicle", "transportation" ], + "char": "\ud83d\ude8c", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + trolleybus: { + keywords: [ "bart", "transportation", "vehicle" ], + "char": "\ud83d\ude8e", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + racing_car: { + keywords: [ "sports", "race", "fast", "formula", "f1" ], + "char": "\ud83c\udfce", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + police_car: { + keywords: [ "vehicle", "cars", "transportation", "law", "legal", "enforcement" ], + "char": "\ud83d\ude93", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ambulance: { + keywords: [ "health", "911", "hospital" ], + "char": "\ud83d\ude91", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fire_engine: { + keywords: [ "transportation", "cars", "vehicle" ], + "char": "\ud83d\ude92", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + minibus: { + keywords: [ "vehicle", "car", "transportation" ], + "char": "\ud83d\ude90", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + truck: { + keywords: [ "cars", "transportation" ], + "char": "\ud83d\ude9a", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + articulated_lorry: { + keywords: [ "vehicle", "cars", "transportation", "express" ], + "char": "\ud83d\ude9b", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tractor: { + keywords: [ "vehicle", "car", "farming", "agriculture" ], + "char": "\ud83d\ude9c", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + kick_scooter: { + keywords: [ "vehicle", "kick", "razor" ], + "char": "\ud83d\udef4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motorcycle: { + keywords: [ "race", "sports", "fast" ], + "char": "\ud83c\udfcd", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bike: { + keywords: [ "sports", "bicycle", "exercise", "hipster" ], + "char": "\ud83d\udeb2", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motor_scooter: { + keywords: [ "vehicle", "vespa", "sasha" ], + "char": "\ud83d\udef5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rotating_light: { + keywords: [ "police", "ambulance", "911", "emergency", "alert", "error", "pinged", "law", "legal" ], + "char": "\ud83d\udea8", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_police_car: { + keywords: [ "vehicle", "law", "legal", "enforcement", "911" ], + "char": "\ud83d\ude94", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_bus: { + keywords: [ "vehicle", "transportation" ], + "char": "\ud83d\ude8d", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_automobile: { + keywords: [ "car", "vehicle", "transportation" ], + "char": "\ud83d\ude98", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_taxi: { + keywords: [ "vehicle", "cars", "uber" ], + "char": "\ud83d\ude96", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + aerial_tramway: { + keywords: [ "transportation", "vehicle", "ski" ], + "char": "\ud83d\udea1", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_cableway: { + keywords: [ "transportation", "vehicle", "ski" ], + "char": "\ud83d\udea0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + suspension_railway: { + keywords: [ "vehicle", "transportation" ], + "char": "\ud83d\ude9f", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + railway_car: { + keywords: [ "transportation", "vehicle" ], + "char": "\ud83d\ude83", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + train: { + keywords: [ "transportation", "vehicle", "carriage", "public", "travel" ], + "char": "\ud83d\ude8b", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + monorail: { + keywords: [ "transportation", "vehicle" ], + "char": "\ud83d\ude9d", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bullettrain_side: { + keywords: [ "transportation", "vehicle" ], + "char": "\ud83d\ude84", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bullettrain_front: { + keywords: [ "transportation", "vehicle", "speed", "fast", "public", "travel" ], + "char": "\ud83d\ude85", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + light_rail: { + keywords: [ "transportation", "vehicle" ], + "char": "\ud83d\ude88", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_railway: { + keywords: [ "transportation", "vehicle" ], + "char": "\ud83d\ude9e", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + steam_locomotive: { + keywords: [ "transportation", "vehicle", "train" ], + "char": "\ud83d\ude82", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + train2: { + keywords: [ "transportation", "vehicle" ], + "char": "\ud83d\ude86", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + metro: { + keywords: [ "transportation", "blue-square", "mrt", "underground", "tube" ], + "char": "\ud83d\ude87", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tram: { + keywords: [ "transportation", "vehicle" ], + "char": "\ud83d\ude8a", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + station: { + keywords: [ "transportation", "vehicle", "public" ], + "char": "\ud83d\ude89", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flying_saucer: { + keywords: [ "transportation", "vehicle", "ufo" ], + "char": "\ud83d\udef8", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + helicopter: { + keywords: [ "transportation", "vehicle", "fly" ], + "char": "\ud83d\ude81", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + small_airplane: { + keywords: [ "flight", "transportation", "fly", "vehicle" ], + "char": "\ud83d\udee9", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + airplane: { + keywords: [ "vehicle", "transportation", "flight", "fly" ], + "char": "\u2708\ufe0f", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flight_departure: { + keywords: [ "airport", "flight", "landing" ], + "char": "\ud83d\udeeb", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flight_arrival: { + keywords: [ "airport", "flight", "boarding" ], + "char": "\ud83d\udeec", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sailboat: { + keywords: [ "ship", "summer", "transportation", "water", "sailing" ], + "char": "\u26f5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motor_boat: { + keywords: [ "ship" ], + "char": "\ud83d\udee5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + speedboat: { + keywords: [ "ship", "transportation", "vehicle", "summer" ], + "char": "\ud83d\udea4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ferry: { + keywords: [ "boat", "ship", "yacht" ], + "char": "\u26f4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + passenger_ship: { + keywords: [ "yacht", "cruise", "ferry" ], + "char": "\ud83d\udef3", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rocket: { + keywords: [ "launch", "ship", "staffmode", "NASA", "outer space", "outer_space", "fly" ], + "char": "\ud83d\ude80", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + artificial_satellite: { + keywords: [ "communication", "gps", "orbit", "spaceflight", "NASA", "ISS" ], + "char": "\ud83d\udef0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + seat: { + keywords: [ "sit", "airplane", "transport", "bus", "flight", "fly" ], + "char": "\ud83d\udcba", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + canoe: { + keywords: [ "boat", "paddle", "water", "ship" ], + "char": "\ud83d\udef6", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + anchor: { + keywords: [ "ship", "ferry", "sea", "boat" ], + "char": "\u2693", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + construction: { + keywords: [ "wip", "progress", "caution", "warning" ], + "char": "\ud83d\udea7", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fuelpump: { + keywords: [ "gas station", "petroleum" ], + "char": "\u26fd", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + busstop: { + keywords: [ "transportation", "wait" ], + "char": "\ud83d\ude8f", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + vertical_traffic_light: { + keywords: [ "transportation", "driving" ], + "char": "\ud83d\udea6", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + traffic_light: { + keywords: [ "transportation", "signal" ], + "char": "\ud83d\udea5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + checkered_flag: { + keywords: [ "contest", "finishline", "race", "gokart" ], + "char": "\ud83c\udfc1", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ship: { + keywords: [ "transportation", "titanic", "deploy" ], + "char": "\ud83d\udea2", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ferris_wheel: { + keywords: [ "photo", "carnival", "londoneye" ], + "char": "\ud83c\udfa1", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + roller_coaster: { + keywords: [ "carnival", "playground", "photo", "fun" ], + "char": "\ud83c\udfa2", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + carousel_horse: { + keywords: [ "photo", "carnival" ], + "char": "\ud83c\udfa0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + building_construction: { + keywords: [ "wip", "working", "progress" ], + "char": "\ud83c\udfd7", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + foggy: { + keywords: [ "photo", "mountain" ], + "char": "\ud83c\udf01", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tokyo_tower: { + keywords: [ "photo", "japanese" ], + "char": "\ud83d\uddfc", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + factory: { + keywords: [ "building", "industry", "pollution", "smoke" ], + "char": "\ud83c\udfed", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fountain: { + keywords: [ "photo", "summer", "water", "fresh" ], + "char": "\u26f2", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rice_scene: { + keywords: [ "photo", "japan", "asia", "tsukimi" ], + "char": "\ud83c\udf91", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain: { + keywords: [ "photo", "nature", "environment" ], + "char": "\u26f0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_snow: { + keywords: [ "photo", "nature", "environment", "winter", "cold" ], + "char": "\ud83c\udfd4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mount_fuji: { + keywords: [ "photo", "mountain", "nature", "japanese" ], + "char": "\ud83d\uddfb", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + volcano: { + keywords: [ "photo", "nature", "disaster" ], + "char": "\ud83c\udf0b", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + japan: { + keywords: [ "nation", "country", "japanese", "asia" ], + "char": "\ud83d\uddfe", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + camping: { + keywords: [ "photo", "outdoors", "tent" ], + "char": "\ud83c\udfd5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tent: { + keywords: [ "photo", "camping", "outdoors" ], + "char": "\u26fa", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + national_park: { + keywords: [ "photo", "environment", "nature" ], + "char": "\ud83c\udfde", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motorway: { + keywords: [ "road", "cupertino", "interstate", "highway" ], + "char": "\ud83d\udee3", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + railway_track: { + keywords: [ "train", "transportation" ], + "char": "\ud83d\udee4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sunrise: { + keywords: [ "morning", "view", "vacation", "photo" ], + "char": "\ud83c\udf05", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sunrise_over_mountains: { + keywords: [ "view", "vacation", "photo" ], + "char": "\ud83c\udf04", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + desert: { + keywords: [ "photo", "warm", "saharah" ], + "char": "\ud83c\udfdc", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + beach_umbrella: { + keywords: [ "weather", "summer", "sunny", "sand", "mojito" ], + "char": "\ud83c\udfd6", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + desert_island: { + keywords: [ "photo", "tropical", "mojito" ], + "char": "\ud83c\udfdd", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + city_sunrise: { + keywords: [ "photo", "good morning", "dawn" ], + "char": "\ud83c\udf07", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + city_sunset: { + keywords: [ "photo", "evening", "sky", "buildings" ], + "char": "\ud83c\udf06", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + cityscape: { + keywords: [ "photo", "night life", "urban" ], + "char": "\ud83c\udfd9", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + night_with_stars: { + keywords: [ "evening", "city", "downtown" ], + "char": "\ud83c\udf03", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bridge_at_night: { + keywords: [ "photo", "sanfrancisco" ], + "char": "\ud83c\udf09", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + milky_way: { + keywords: [ "photo", "space", "stars" ], + "char": "\ud83c\udf0c", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + stars: { + keywords: [ "night", "photo" ], + "char": "\ud83c\udf20", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sparkler: { + keywords: [ "stars", "night", "shine" ], + "char": "\ud83c\udf87", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fireworks: { + keywords: [ "photo", "festival", "carnival", "congratulations" ], + "char": "\ud83c\udf86", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rainbow: { + keywords: [ "nature", "happy", "unicorn_face", "photo", "sky", "spring" ], + "char": "\ud83c\udf08", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + houses: { + keywords: [ "buildings", "photo" ], + "char": "\ud83c\udfd8", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + european_castle: { + keywords: [ "building", "royalty", "history" ], + "char": "\ud83c\udff0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + japanese_castle: { + keywords: [ "photo", "building" ], + "char": "\ud83c\udfef", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + stadium: { + keywords: [ "photo", "place", "sports", "concert", "venue" ], + "char": "\ud83c\udfdf", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + statue_of_liberty: { + keywords: [ "american", "newyork" ], + "char": "\ud83d\uddfd", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + house: { + keywords: [ "building", "home" ], + "char": "\ud83c\udfe0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + house_with_garden: { + keywords: [ "home", "plant", "nature" ], + "char": "\ud83c\udfe1", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + derelict_house: { + keywords: [ "abandon", "evict", "broken", "building" ], + "char": "\ud83c\udfda", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + office: { + keywords: [ "building", "bureau", "work" ], + "char": "\ud83c\udfe2", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + department_store: { + keywords: [ "building", "shopping", "mall" ], + "char": "\ud83c\udfec", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + post_office: { + keywords: [ "building", "envelope", "communication" ], + "char": "\ud83c\udfe3", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + european_post_office: { + keywords: [ "building", "email" ], + "char": "\ud83c\udfe4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + hospital: { + keywords: [ "building", "health", "surgery", "doctor" ], + "char": "\ud83c\udfe5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bank: { + keywords: [ "building", "money", "sales", "cash", "business", "enterprise" ], + "char": "\ud83c\udfe6", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + hotel: { + keywords: [ "building", "accomodation", "checkin" ], + "char": "\ud83c\udfe8", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + convenience_store: { + keywords: [ "building", "shopping", "groceries" ], + "char": "\ud83c\udfea", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + school: { + keywords: [ "building", "student", "education", "learn", "teach" ], + "char": "\ud83c\udfeb", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + love_hotel: { + keywords: [ "like", "affection", "dating" ], + "char": "\ud83c\udfe9", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + wedding: { + keywords: [ "love", "like", "affection", "couple", "marriage", "bride", "groom" ], + "char": "\ud83d\udc92", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + classical_building: { + keywords: [ "art", "culture", "history" ], + "char": "\ud83c\udfdb", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + church: { + keywords: [ "building", "religion", "christ" ], + "char": "\u26ea", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mosque: { + keywords: [ "islam", "worship", "minaret" ], + "char": "\ud83d\udd4c", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + synagogue: { + keywords: [ "judaism", "worship", "temple", "jewish" ], + "char": "\ud83d\udd4d", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + kaaba: { + keywords: [ "mecca", "mosque", "islam" ], + "char": "\ud83d\udd4b", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + shinto_shrine: { + keywords: [ "temple", "japan", "kyoto" ], + "char": "\u26e9", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + watch: { + keywords: [ "time", "accessories" ], + "char": "\u231a", + fitzpatrick_scale: false, + category: "objects" + }, + iphone: { + keywords: [ "technology", "apple", "gadgets", "dial" ], + "char": "\ud83d\udcf1", + fitzpatrick_scale: false, + category: "objects" + }, + calling: { + keywords: [ "iphone", "incoming" ], + "char": "\ud83d\udcf2", + fitzpatrick_scale: false, + category: "objects" + }, + computer: { + keywords: [ "technology", "laptop", "screen", "display", "monitor" ], + "char": "\ud83d\udcbb", + fitzpatrick_scale: false, + category: "objects" + }, + keyboard: { + keywords: [ "technology", "computer", "type", "input", "text" ], + "char": "\u2328", + fitzpatrick_scale: false, + category: "objects" + }, + desktop_computer: { + keywords: [ "technology", "computing", "screen" ], + "char": "\ud83d\udda5", + fitzpatrick_scale: false, + category: "objects" + }, + printer: { + keywords: [ "paper", "ink" ], + "char": "\ud83d\udda8", + fitzpatrick_scale: false, + category: "objects" + }, + computer_mouse: { + keywords: [ "click" ], + "char": "\ud83d\uddb1", + fitzpatrick_scale: false, + category: "objects" + }, + trackball: { + keywords: [ "technology", "trackpad" ], + "char": "\ud83d\uddb2", + fitzpatrick_scale: false, + category: "objects" + }, + joystick: { + keywords: [ "game", "play" ], + "char": "\ud83d\udd79", + fitzpatrick_scale: false, + category: "objects" + }, + clamp: { + keywords: [ "tool" ], + "char": "\ud83d\udddc", + fitzpatrick_scale: false, + category: "objects" + }, + minidisc: { + keywords: [ "technology", "record", "data", "disk", "90s" ], + "char": "\ud83d\udcbd", + fitzpatrick_scale: false, + category: "objects" + }, + floppy_disk: { + keywords: [ "oldschool", "technology", "save", "90s", "80s" ], + "char": "\ud83d\udcbe", + fitzpatrick_scale: false, + category: "objects" + }, + cd: { + keywords: [ "technology", "dvd", "disk", "disc", "90s" ], + "char": "\ud83d\udcbf", + fitzpatrick_scale: false, + category: "objects" + }, + dvd: { + keywords: [ "cd", "disk", "disc" ], + "char": "\ud83d\udcc0", + fitzpatrick_scale: false, + category: "objects" + }, + vhs: { + keywords: [ "record", "video", "oldschool", "90s", "80s" ], + "char": "\ud83d\udcfc", + fitzpatrick_scale: false, + category: "objects" + }, + camera: { + keywords: [ "gadgets", "photography" ], + "char": "\ud83d\udcf7", + fitzpatrick_scale: false, + category: "objects" + }, + camera_flash: { + keywords: [ "photography", "gadgets" ], + "char": "\ud83d\udcf8", + fitzpatrick_scale: false, + category: "objects" + }, + video_camera: { + keywords: [ "film", "record" ], + "char": "\ud83d\udcf9", + fitzpatrick_scale: false, + category: "objects" + }, + movie_camera: { + keywords: [ "film", "record" ], + "char": "\ud83c\udfa5", + fitzpatrick_scale: false, + category: "objects" + }, + film_projector: { + keywords: [ "video", "tape", "record", "movie" ], + "char": "\ud83d\udcfd", + fitzpatrick_scale: false, + category: "objects" + }, + film_strip: { + keywords: [ "movie" ], + "char": "\ud83c\udf9e", + fitzpatrick_scale: false, + category: "objects" + }, + telephone_receiver: { + keywords: [ "technology", "communication", "dial" ], + "char": "\ud83d\udcde", + fitzpatrick_scale: false, + category: "objects" + }, + phone: { + keywords: [ "technology", "communication", "dial", "telephone" ], + "char": "\u260e\ufe0f", + fitzpatrick_scale: false, + category: "objects" + }, + pager: { + keywords: [ "bbcall", "oldschool", "90s" ], + "char": "\ud83d\udcdf", + fitzpatrick_scale: false, + category: "objects" + }, + fax: { + keywords: [ "communication", "technology" ], + "char": "\ud83d\udce0", + fitzpatrick_scale: false, + category: "objects" + }, + tv: { + keywords: [ "technology", "program", "oldschool", "show", "television" ], + "char": "\ud83d\udcfa", + fitzpatrick_scale: false, + category: "objects" + }, + radio: { + keywords: [ "communication", "music", "podcast", "program" ], + "char": "\ud83d\udcfb", + fitzpatrick_scale: false, + category: "objects" + }, + studio_microphone: { + keywords: [ "sing", "recording", "artist", "talkshow" ], + "char": "\ud83c\udf99", + fitzpatrick_scale: false, + category: "objects" + }, + level_slider: { + keywords: [ "scale" ], + "char": "\ud83c\udf9a", + fitzpatrick_scale: false, + category: "objects" + }, + control_knobs: { + keywords: [ "dial" ], + "char": "\ud83c\udf9b", + fitzpatrick_scale: false, + category: "objects" + }, + compass: { + keywords: [ "magnetic", "navigation", "orienteering" ], + "char": "\ud83e\udded", + fitzpatrick_scale: false, + category: "objects" + }, + stopwatch: { + keywords: [ "time", "deadline" ], + "char": "\u23f1", + fitzpatrick_scale: false, + category: "objects" + }, + timer_clock: { + keywords: [ "alarm" ], + "char": "\u23f2", + fitzpatrick_scale: false, + category: "objects" + }, + alarm_clock: { + keywords: [ "time", "wake" ], + "char": "\u23f0", + fitzpatrick_scale: false, + category: "objects" + }, + mantelpiece_clock: { + keywords: [ "time" ], + "char": "\ud83d\udd70", + fitzpatrick_scale: false, + category: "objects" + }, + hourglass_flowing_sand: { + keywords: [ "oldschool", "time", "countdown" ], + "char": "\u23f3", + fitzpatrick_scale: false, + category: "objects" + }, + hourglass: { + keywords: [ "time", "clock", "oldschool", "limit", "exam", "quiz", "test" ], + "char": "\u231b", + fitzpatrick_scale: false, + category: "objects" + }, + satellite: { + keywords: [ "communication", "future", "radio", "space" ], + "char": "\ud83d\udce1", + fitzpatrick_scale: false, + category: "objects" + }, + battery: { + keywords: [ "power", "energy", "sustain" ], + "char": "\ud83d\udd0b", + fitzpatrick_scale: false, + category: "objects" + }, + electric_plug: { + keywords: [ "charger", "power" ], + "char": "\ud83d\udd0c", + fitzpatrick_scale: false, + category: "objects" + }, + bulb: { + keywords: [ "light", "electricity", "idea" ], + "char": "\ud83d\udca1", + fitzpatrick_scale: false, + category: "objects" + }, + flashlight: { + keywords: [ "dark", "camping", "sight", "night" ], + "char": "\ud83d\udd26", + fitzpatrick_scale: false, + category: "objects" + }, + candle: { + keywords: [ "fire", "wax" ], + "char": "\ud83d\udd6f", + fitzpatrick_scale: false, + category: "objects" + }, + fire_extinguisher: { + keywords: [ "quench" ], + "char": "\ud83e\uddef", + fitzpatrick_scale: false, + category: "objects" + }, + wastebasket: { + keywords: [ "bin", "trash", "rubbish", "garbage", "toss" ], + "char": "\ud83d\uddd1", + fitzpatrick_scale: false, + category: "objects" + }, + oil_drum: { + keywords: [ "barrell" ], + "char": "\ud83d\udee2", + fitzpatrick_scale: false, + category: "objects" + }, + money_with_wings: { + keywords: [ "dollar", "bills", "payment", "sale" ], + "char": "\ud83d\udcb8", + fitzpatrick_scale: false, + category: "objects" + }, + dollar: { + keywords: [ "money", "sales", "bill", "currency" ], + "char": "\ud83d\udcb5", + fitzpatrick_scale: false, + category: "objects" + }, + yen: { + keywords: [ "money", "sales", "japanese", "dollar", "currency" ], + "char": "\ud83d\udcb4", + fitzpatrick_scale: false, + category: "objects" + }, + euro: { + keywords: [ "money", "sales", "dollar", "currency" ], + "char": "\ud83d\udcb6", + fitzpatrick_scale: false, + category: "objects" + }, + pound: { + keywords: [ "british", "sterling", "money", "sales", "bills", "uk", "england", "currency" ], + "char": "\ud83d\udcb7", + fitzpatrick_scale: false, + category: "objects" + }, + moneybag: { + keywords: [ "dollar", "payment", "coins", "sale" ], + "char": "\ud83d\udcb0", + fitzpatrick_scale: false, + category: "objects" + }, + credit_card: { + keywords: [ "money", "sales", "dollar", "bill", "payment", "shopping" ], + "char": "\ud83d\udcb3", + fitzpatrick_scale: false, + category: "objects" + }, + gem: { + keywords: [ "blue", "ruby", "diamond", "jewelry" ], + "char": "\ud83d\udc8e", + fitzpatrick_scale: false, + category: "objects" + }, + balance_scale: { + keywords: [ "law", "fairness", "weight" ], + "char": "\u2696", + fitzpatrick_scale: false, + category: "objects" + }, + toolbox: { + keywords: [ "tools", "diy", "fix", "maintainer", "mechanic" ], + "char": "\ud83e\uddf0", + fitzpatrick_scale: false, + category: "objects" + }, + wrench: { + keywords: [ "tools", "diy", "ikea", "fix", "maintainer" ], + "char": "\ud83d\udd27", + fitzpatrick_scale: false, + category: "objects" + }, + hammer: { + keywords: [ "tools", "build", "create" ], + "char": "\ud83d\udd28", + fitzpatrick_scale: false, + category: "objects" + }, + hammer_and_pick: { + keywords: [ "tools", "build", "create" ], + "char": "\u2692", + fitzpatrick_scale: false, + category: "objects" + }, + hammer_and_wrench: { + keywords: [ "tools", "build", "create" ], + "char": "\ud83d\udee0", + fitzpatrick_scale: false, + category: "objects" + }, + pick: { + keywords: [ "tools", "dig" ], + "char": "\u26cf", + fitzpatrick_scale: false, + category: "objects" + }, + nut_and_bolt: { + keywords: [ "handy", "tools", "fix" ], + "char": "\ud83d\udd29", + fitzpatrick_scale: false, + category: "objects" + }, + gear: { + keywords: [ "cog" ], + "char": "\u2699", + fitzpatrick_scale: false, + category: "objects" + }, + brick: { + keywords: [ "bricks" ], + "char": "\ud83e\uddf1", + fitzpatrick_scale: false, + category: "objects" + }, + chains: { + keywords: [ "lock", "arrest" ], + "char": "\u26d3", + fitzpatrick_scale: false, + category: "objects" + }, + magnet: { + keywords: [ "attraction", "magnetic" ], + "char": "\ud83e\uddf2", + fitzpatrick_scale: false, + category: "objects" + }, + gun: { + keywords: [ "violence", "weapon", "pistol", "revolver" ], + "char": "\ud83d\udd2b", + fitzpatrick_scale: false, + category: "objects" + }, + bomb: { + keywords: [ "boom", "explode", "explosion", "terrorism" ], + "char": "\ud83d\udca3", + fitzpatrick_scale: false, + category: "objects" + }, + firecracker: { + keywords: [ "dynamite", "boom", "explode", "explosion", "explosive" ], + "char": "\ud83e\udde8", + fitzpatrick_scale: false, + category: "objects" + }, + hocho: { + keywords: [ "knife", "blade", "cutlery", "kitchen", "weapon" ], + "char": "\ud83d\udd2a", + fitzpatrick_scale: false, + category: "objects" + }, + dagger: { + keywords: [ "weapon" ], + "char": "\ud83d\udde1", + fitzpatrick_scale: false, + category: "objects" + }, + crossed_swords: { + keywords: [ "weapon" ], + "char": "\u2694", + fitzpatrick_scale: false, + category: "objects" + }, + shield: { + keywords: [ "protection", "security" ], + "char": "\ud83d\udee1", + fitzpatrick_scale: false, + category: "objects" + }, + smoking: { + keywords: [ "kills", "tobacco", "cigarette", "joint", "smoke" ], + "char": "\ud83d\udeac", + fitzpatrick_scale: false, + category: "objects" + }, + skull_and_crossbones: { + keywords: [ "poison", "danger", "deadly", "scary", "death", "pirate", "evil" ], + "char": "\u2620", + fitzpatrick_scale: false, + category: "objects" + }, + coffin: { + keywords: [ "vampire", "dead", "die", "death", "rip", "graveyard", "cemetery", "casket", "funeral", "box" ], + "char": "\u26b0", + fitzpatrick_scale: false, + category: "objects" + }, + funeral_urn: { + keywords: [ "dead", "die", "death", "rip", "ashes" ], + "char": "\u26b1", + fitzpatrick_scale: false, + category: "objects" + }, + amphora: { + keywords: [ "vase", "jar" ], + "char": "\ud83c\udffa", + fitzpatrick_scale: false, + category: "objects" + }, + crystal_ball: { + keywords: [ "disco", "party", "magic", "circus", "fortune_teller" ], + "char": "\ud83d\udd2e", + fitzpatrick_scale: false, + category: "objects" + }, + prayer_beads: { + keywords: [ "dhikr", "religious" ], + "char": "\ud83d\udcff", + fitzpatrick_scale: false, + category: "objects" + }, + nazar_amulet: { + keywords: [ "bead", "charm" ], + "char": "\ud83e\uddff", + fitzpatrick_scale: false, + category: "objects" + }, + barber: { + keywords: [ "hair", "salon", "style" ], + "char": "\ud83d\udc88", + fitzpatrick_scale: false, + category: "objects" + }, + alembic: { + keywords: [ "distilling", "science", "experiment", "chemistry" ], + "char": "\u2697", + fitzpatrick_scale: false, + category: "objects" + }, + telescope: { + keywords: [ "stars", "space", "zoom", "science", "astronomy" ], + "char": "\ud83d\udd2d", + fitzpatrick_scale: false, + category: "objects" + }, + microscope: { + keywords: [ "laboratory", "experiment", "zoomin", "science", "study" ], + "char": "\ud83d\udd2c", + fitzpatrick_scale: false, + category: "objects" + }, + hole: { + keywords: [ "embarrassing" ], + "char": "\ud83d\udd73", + fitzpatrick_scale: false, + category: "objects" + }, + pill: { + keywords: [ "health", "medicine", "doctor", "pharmacy", "drug" ], + "char": "\ud83d\udc8a", + fitzpatrick_scale: false, + category: "objects" + }, + syringe: { + keywords: [ "health", "hospital", "drugs", "blood", "medicine", "needle", "doctor", "nurse" ], + "char": "\ud83d\udc89", + fitzpatrick_scale: false, + category: "objects" + }, + dna: { + keywords: [ "biologist", "genetics", "life" ], + "char": "\ud83e\uddec", + fitzpatrick_scale: false, + category: "objects" + }, + microbe: { + keywords: [ "amoeba", "bacteria", "germs" ], + "char": "\ud83e\udda0", + fitzpatrick_scale: false, + category: "objects" + }, + petri_dish: { + keywords: [ "bacteria", "biology", "culture", "lab" ], + "char": "\ud83e\uddeb", + fitzpatrick_scale: false, + category: "objects" + }, + test_tube: { + keywords: [ "chemistry", "experiment", "lab", "science" ], + "char": "\ud83e\uddea", + fitzpatrick_scale: false, + category: "objects" + }, + thermometer: { + keywords: [ "weather", "temperature", "hot", "cold" ], + "char": "\ud83c\udf21", + fitzpatrick_scale: false, + category: "objects" + }, + broom: { + keywords: [ "cleaning", "sweeping", "witch" ], + "char": "\ud83e\uddf9", + fitzpatrick_scale: false, + category: "objects" + }, + basket: { + keywords: [ "laundry" ], + "char": "\ud83e\uddfa", + fitzpatrick_scale: false, + category: "objects" + }, + toilet_paper: { + keywords: [ "roll" ], + "char": "\ud83e\uddfb", + fitzpatrick_scale: false, + category: "objects" + }, + label: { + keywords: [ "sale", "tag" ], + "char": "\ud83c\udff7", + fitzpatrick_scale: false, + category: "objects" + }, + bookmark: { + keywords: [ "favorite", "label", "save" ], + "char": "\ud83d\udd16", + fitzpatrick_scale: false, + category: "objects" + }, + toilet: { + keywords: [ "restroom", "wc", "washroom", "bathroom", "potty" ], + "char": "\ud83d\udebd", + fitzpatrick_scale: false, + category: "objects" + }, + shower: { + keywords: [ "clean", "water", "bathroom" ], + "char": "\ud83d\udebf", + fitzpatrick_scale: false, + category: "objects" + }, + bathtub: { + keywords: [ "clean", "shower", "bathroom" ], + "char": "\ud83d\udec1", + fitzpatrick_scale: false, + category: "objects" + }, + soap: { + keywords: [ "bar", "bathing", "cleaning", "lather" ], + "char": "\ud83e\uddfc", + fitzpatrick_scale: false, + category: "objects" + }, + sponge: { + keywords: [ "absorbing", "cleaning", "porous" ], + "char": "\ud83e\uddfd", + fitzpatrick_scale: false, + category: "objects" + }, + lotion_bottle: { + keywords: [ "moisturizer", "sunscreen" ], + "char": "\ud83e\uddf4", + fitzpatrick_scale: false, + category: "objects" + }, + key: { + keywords: [ "lock", "door", "password" ], + "char": "\ud83d\udd11", + fitzpatrick_scale: false, + category: "objects" + }, + old_key: { + keywords: [ "lock", "door", "password" ], + "char": "\ud83d\udddd", + fitzpatrick_scale: false, + category: "objects" + }, + couch_and_lamp: { + keywords: [ "read", "chill" ], + "char": "\ud83d\udecb", + fitzpatrick_scale: false, + category: "objects" + }, + sleeping_bed: { + keywords: [ "bed", "rest" ], + "char": "\ud83d\udecc", + fitzpatrick_scale: true, + category: "objects" + }, + bed: { + keywords: [ "sleep", "rest" ], + "char": "\ud83d\udecf", + fitzpatrick_scale: false, + category: "objects" + }, + door: { + keywords: [ "house", "entry", "exit" ], + "char": "\ud83d\udeaa", + fitzpatrick_scale: false, + category: "objects" + }, + bellhop_bell: { + keywords: [ "service" ], + "char": "\ud83d\udece", + fitzpatrick_scale: false, + category: "objects" + }, + teddy_bear: { + keywords: [ "plush", "stuffed" ], + "char": "\ud83e\uddf8", + fitzpatrick_scale: false, + category: "objects" + }, + framed_picture: { + keywords: [ "photography" ], + "char": "\ud83d\uddbc", + fitzpatrick_scale: false, + category: "objects" + }, + world_map: { + keywords: [ "location", "direction" ], + "char": "\ud83d\uddfa", + fitzpatrick_scale: false, + category: "objects" + }, + parasol_on_ground: { + keywords: [ "weather", "summer" ], + "char": "\u26f1", + fitzpatrick_scale: false, + category: "objects" + }, + moyai: { + keywords: [ "rock", "easter island", "moai" ], + "char": "\ud83d\uddff", + fitzpatrick_scale: false, + category: "objects" + }, + shopping: { + keywords: [ "mall", "buy", "purchase" ], + "char": "\ud83d\udecd", + fitzpatrick_scale: false, + category: "objects" + }, + shopping_cart: { + keywords: [ "trolley" ], + "char": "\ud83d\uded2", + fitzpatrick_scale: false, + category: "objects" + }, + balloon: { + keywords: [ "party", "celebration", "birthday", "circus" ], + "char": "\ud83c\udf88", + fitzpatrick_scale: false, + category: "objects" + }, + flags: { + keywords: [ "fish", "japanese", "koinobori", "carp", "banner" ], + "char": "\ud83c\udf8f", + fitzpatrick_scale: false, + category: "objects" + }, + ribbon: { + keywords: [ "decoration", "pink", "girl", "bowtie" ], + "char": "\ud83c\udf80", + fitzpatrick_scale: false, + category: "objects" + }, + gift: { + keywords: [ "present", "birthday", "christmas", "xmas" ], + "char": "\ud83c\udf81", + fitzpatrick_scale: false, + category: "objects" + }, + confetti_ball: { + keywords: [ "festival", "party", "birthday", "circus" ], + "char": "\ud83c\udf8a", + fitzpatrick_scale: false, + category: "objects" + }, + tada: { + keywords: [ "party", "congratulations", "birthday", "magic", "circus", "celebration" ], + "char": "\ud83c\udf89", + fitzpatrick_scale: false, + category: "objects" + }, + dolls: { + keywords: [ "japanese", "toy", "kimono" ], + "char": "\ud83c\udf8e", + fitzpatrick_scale: false, + category: "objects" + }, + wind_chime: { + keywords: [ "nature", "ding", "spring", "bell" ], + "char": "\ud83c\udf90", + fitzpatrick_scale: false, + category: "objects" + }, + crossed_flags: { + keywords: [ "japanese", "nation", "country", "border" ], + "char": "\ud83c\udf8c", + fitzpatrick_scale: false, + category: "objects" + }, + izakaya_lantern: { + keywords: [ "light", "paper", "halloween", "spooky" ], + "char": "\ud83c\udfee", + fitzpatrick_scale: false, + category: "objects" + }, + red_envelope: { + keywords: [ "gift" ], + "char": "\ud83e\udde7", + fitzpatrick_scale: false, + category: "objects" + }, + email: { + keywords: [ "letter", "postal", "inbox", "communication" ], + "char": "\u2709\ufe0f", + fitzpatrick_scale: false, + category: "objects" + }, + envelope_with_arrow: { + keywords: [ "email", "communication" ], + "char": "\ud83d\udce9", + fitzpatrick_scale: false, + category: "objects" + }, + incoming_envelope: { + keywords: [ "email", "inbox" ], + "char": "\ud83d\udce8", + fitzpatrick_scale: false, + category: "objects" + }, + "e-mail": { + keywords: [ "communication", "inbox" ], + "char": "\ud83d\udce7", + fitzpatrick_scale: false, + category: "objects" + }, + love_letter: { + keywords: [ "email", "like", "affection", "envelope", "valentines" ], + "char": "\ud83d\udc8c", + fitzpatrick_scale: false, + category: "objects" + }, + postbox: { + keywords: [ "email", "letter", "envelope" ], + "char": "\ud83d\udcee", + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_closed: { + keywords: [ "email", "communication", "inbox" ], + "char": "\ud83d\udcea", + fitzpatrick_scale: false, + category: "objects" + }, + mailbox: { + keywords: [ "email", "inbox", "communication" ], + "char": "\ud83d\udceb", + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_with_mail: { + keywords: [ "email", "inbox", "communication" ], + "char": "\ud83d\udcec", + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_with_no_mail: { + keywords: [ "email", "inbox" ], + "char": "\ud83d\udced", + fitzpatrick_scale: false, + category: "objects" + }, + "package": { + keywords: [ "mail", "gift", "cardboard", "box", "moving" ], + "char": "\ud83d\udce6", + fitzpatrick_scale: false, + category: "objects" + }, + postal_horn: { + keywords: [ "instrument", "music" ], + "char": "\ud83d\udcef", + fitzpatrick_scale: false, + category: "objects" + }, + inbox_tray: { + keywords: [ "email", "documents" ], + "char": "\ud83d\udce5", + fitzpatrick_scale: false, + category: "objects" + }, + outbox_tray: { + keywords: [ "inbox", "email" ], + "char": "\ud83d\udce4", + fitzpatrick_scale: false, + category: "objects" + }, + scroll: { + keywords: [ "documents", "ancient", "history", "paper" ], + "char": "\ud83d\udcdc", + fitzpatrick_scale: false, + category: "objects" + }, + page_with_curl: { + keywords: [ "documents", "office", "paper" ], + "char": "\ud83d\udcc3", + fitzpatrick_scale: false, + category: "objects" + }, + bookmark_tabs: { + keywords: [ "favorite", "save", "order", "tidy" ], + "char": "\ud83d\udcd1", + fitzpatrick_scale: false, + category: "objects" + }, + receipt: { + keywords: [ "accounting", "expenses" ], + "char": "\ud83e\uddfe", + fitzpatrick_scale: false, + category: "objects" + }, + bar_chart: { + keywords: [ "graph", "presentation", "stats" ], + "char": "\ud83d\udcca", + fitzpatrick_scale: false, + category: "objects" + }, + chart_with_upwards_trend: { + keywords: [ "graph", "presentation", "stats", "recovery", "business", "economics", "money", "sales", "good", "success" ], + "char": "\ud83d\udcc8", + fitzpatrick_scale: false, + category: "objects" + }, + chart_with_downwards_trend: { + keywords: [ "graph", "presentation", "stats", "recession", "business", "economics", "money", "sales", "bad", "failure" ], + "char": "\ud83d\udcc9", + fitzpatrick_scale: false, + category: "objects" + }, + page_facing_up: { + keywords: [ "documents", "office", "paper", "information" ], + "char": "\ud83d\udcc4", + fitzpatrick_scale: false, + category: "objects" + }, + date: { + keywords: [ "calendar", "schedule" ], + "char": "\ud83d\udcc5", + fitzpatrick_scale: false, + category: "objects" + }, + calendar: { + keywords: [ "schedule", "date", "planning" ], + "char": "\ud83d\udcc6", + fitzpatrick_scale: false, + category: "objects" + }, + spiral_calendar: { + keywords: [ "date", "schedule", "planning" ], + "char": "\ud83d\uddd3", + fitzpatrick_scale: false, + category: "objects" + }, + card_index: { + keywords: [ "business", "stationery" ], + "char": "\ud83d\udcc7", + fitzpatrick_scale: false, + category: "objects" + }, + card_file_box: { + keywords: [ "business", "stationery" ], + "char": "\ud83d\uddc3", + fitzpatrick_scale: false, + category: "objects" + }, + ballot_box: { + keywords: [ "election", "vote" ], + "char": "\ud83d\uddf3", + fitzpatrick_scale: false, + category: "objects" + }, + file_cabinet: { + keywords: [ "filing", "organizing" ], + "char": "\ud83d\uddc4", + fitzpatrick_scale: false, + category: "objects" + }, + clipboard: { + keywords: [ "stationery", "documents" ], + "char": "\ud83d\udccb", + fitzpatrick_scale: false, + category: "objects" + }, + spiral_notepad: { + keywords: [ "memo", "stationery" ], + "char": "\ud83d\uddd2", + fitzpatrick_scale: false, + category: "objects" + }, + file_folder: { + keywords: [ "documents", "business", "office" ], + "char": "\ud83d\udcc1", + fitzpatrick_scale: false, + category: "objects" + }, + open_file_folder: { + keywords: [ "documents", "load" ], + "char": "\ud83d\udcc2", + fitzpatrick_scale: false, + category: "objects" + }, + card_index_dividers: { + keywords: [ "organizing", "business", "stationery" ], + "char": "\ud83d\uddc2", + fitzpatrick_scale: false, + category: "objects" + }, + newspaper_roll: { + keywords: [ "press", "headline" ], + "char": "\ud83d\uddde", + fitzpatrick_scale: false, + category: "objects" + }, + newspaper: { + keywords: [ "press", "headline" ], + "char": "\ud83d\udcf0", + fitzpatrick_scale: false, + category: "objects" + }, + notebook: { + keywords: [ "stationery", "record", "notes", "paper", "study" ], + "char": "\ud83d\udcd3", + fitzpatrick_scale: false, + category: "objects" + }, + closed_book: { + keywords: [ "read", "library", "knowledge", "textbook", "learn" ], + "char": "\ud83d\udcd5", + fitzpatrick_scale: false, + category: "objects" + }, + green_book: { + keywords: [ "read", "library", "knowledge", "study" ], + "char": "\ud83d\udcd7", + fitzpatrick_scale: false, + category: "objects" + }, + blue_book: { + keywords: [ "read", "library", "knowledge", "learn", "study" ], + "char": "\ud83d\udcd8", + fitzpatrick_scale: false, + category: "objects" + }, + orange_book: { + keywords: [ "read", "library", "knowledge", "textbook", "study" ], + "char": "\ud83d\udcd9", + fitzpatrick_scale: false, + category: "objects" + }, + notebook_with_decorative_cover: { + keywords: [ "classroom", "notes", "record", "paper", "study" ], + "char": "\ud83d\udcd4", + fitzpatrick_scale: false, + category: "objects" + }, + ledger: { + keywords: [ "notes", "paper" ], + "char": "\ud83d\udcd2", + fitzpatrick_scale: false, + category: "objects" + }, + books: { + keywords: [ "literature", "library", "study" ], + "char": "\ud83d\udcda", + fitzpatrick_scale: false, + category: "objects" + }, + open_book: { + keywords: [ "book", "read", "library", "knowledge", "literature", "learn", "study" ], + "char": "\ud83d\udcd6", + fitzpatrick_scale: false, + category: "objects" + }, + safety_pin: { + keywords: [ "diaper" ], + "char": "\ud83e\uddf7", + fitzpatrick_scale: false, + category: "objects" + }, + link: { + keywords: [ "rings", "url" ], + "char": "\ud83d\udd17", + fitzpatrick_scale: false, + category: "objects" + }, + paperclip: { + keywords: [ "documents", "stationery" ], + "char": "\ud83d\udcce", + fitzpatrick_scale: false, + category: "objects" + }, + paperclips: { + keywords: [ "documents", "stationery" ], + "char": "\ud83d\udd87", + fitzpatrick_scale: false, + category: "objects" + }, + scissors: { + keywords: [ "stationery", "cut" ], + "char": "\u2702\ufe0f", + fitzpatrick_scale: false, + category: "objects" + }, + triangular_ruler: { + keywords: [ "stationery", "math", "architect", "sketch" ], + "char": "\ud83d\udcd0", + fitzpatrick_scale: false, + category: "objects" + }, + straight_ruler: { + keywords: [ "stationery", "calculate", "length", "math", "school", "drawing", "architect", "sketch" ], + "char": "\ud83d\udccf", + fitzpatrick_scale: false, + category: "objects" + }, + abacus: { + keywords: [ "calculation" ], + "char": "\ud83e\uddee", + fitzpatrick_scale: false, + category: "objects" + }, + pushpin: { + keywords: [ "stationery", "mark", "here" ], + "char": "\ud83d\udccc", + fitzpatrick_scale: false, + category: "objects" + }, + round_pushpin: { + keywords: [ "stationery", "location", "map", "here" ], + "char": "\ud83d\udccd", + fitzpatrick_scale: false, + category: "objects" + }, + triangular_flag_on_post: { + keywords: [ "mark", "milestone", "place" ], + "char": "\ud83d\udea9", + fitzpatrick_scale: false, + category: "objects" + }, + white_flag: { + keywords: [ "losing", "loser", "lost", "surrender", "give up", "fail" ], + "char": "\ud83c\udff3", + fitzpatrick_scale: false, + category: "objects" + }, + black_flag: { + keywords: [ "pirate" ], + "char": "\ud83c\udff4", + fitzpatrick_scale: false, + category: "objects" + }, + rainbow_flag: { + keywords: [ "flag", "rainbow", "pride", "gay", "lgbt", "glbt", "queer", "homosexual", "lesbian", "bisexual", "transgender" ], + "char": "\ud83c\udff3\ufe0f\u200d\ud83c\udf08", + fitzpatrick_scale: false, + category: "objects" + }, + closed_lock_with_key: { + keywords: [ "security", "privacy" ], + "char": "\ud83d\udd10", + fitzpatrick_scale: false, + category: "objects" + }, + lock: { + keywords: [ "security", "password", "padlock" ], + "char": "\ud83d\udd12", + fitzpatrick_scale: false, + category: "objects" + }, + unlock: { + keywords: [ "privacy", "security" ], + "char": "\ud83d\udd13", + fitzpatrick_scale: false, + category: "objects" + }, + lock_with_ink_pen: { + keywords: [ "security", "secret" ], + "char": "\ud83d\udd0f", + fitzpatrick_scale: false, + category: "objects" + }, + pen: { + keywords: [ "stationery", "writing", "write" ], + "char": "\ud83d\udd8a", + fitzpatrick_scale: false, + category: "objects" + }, + fountain_pen: { + keywords: [ "stationery", "writing", "write" ], + "char": "\ud83d\udd8b", + fitzpatrick_scale: false, + category: "objects" + }, + black_nib: { + keywords: [ "pen", "stationery", "writing", "write" ], + "char": "\u2712\ufe0f", + fitzpatrick_scale: false, + category: "objects" + }, + memo: { + keywords: [ "write", "documents", "stationery", "pencil", "paper", "writing", "legal", "exam", "quiz", "test", "study", "compose" ], + "char": "\ud83d\udcdd", + fitzpatrick_scale: false, + category: "objects" + }, + pencil2: { + keywords: [ "stationery", "write", "paper", "writing", "school", "study" ], + "char": "\u270f\ufe0f", + fitzpatrick_scale: false, + category: "objects" + }, + crayon: { + keywords: [ "drawing", "creativity" ], + "char": "\ud83d\udd8d", + fitzpatrick_scale: false, + category: "objects" + }, + paintbrush: { + keywords: [ "drawing", "creativity", "art" ], + "char": "\ud83d\udd8c", + fitzpatrick_scale: false, + category: "objects" + }, + mag: { + keywords: [ "search", "zoom", "find", "detective" ], + "char": "\ud83d\udd0d", + fitzpatrick_scale: false, + category: "objects" + }, + mag_right: { + keywords: [ "search", "zoom", "find", "detective" ], + "char": "\ud83d\udd0e", + fitzpatrick_scale: false, + category: "objects" + }, + heart: { + keywords: [ "love", "like", "valentines" ], + "char": "\u2764\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + orange_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": "\ud83e\udde1", + fitzpatrick_scale: false, + category: "symbols" + }, + yellow_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": "\ud83d\udc9b", + fitzpatrick_scale: false, + category: "symbols" + }, + green_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": "\ud83d\udc9a", + fitzpatrick_scale: false, + category: "symbols" + }, + blue_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": "\ud83d\udc99", + fitzpatrick_scale: false, + category: "symbols" + }, + purple_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": "\ud83d\udc9c", + fitzpatrick_scale: false, + category: "symbols" + }, + black_heart: { + keywords: [ "evil" ], + "char": "\ud83d\udda4", + fitzpatrick_scale: false, + category: "symbols" + }, + broken_heart: { + keywords: [ "sad", "sorry", "break", "heart", "heartbreak" ], + "char": "\ud83d\udc94", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_heart_exclamation: { + keywords: [ "decoration", "love" ], + "char": "\u2763", + fitzpatrick_scale: false, + category: "symbols" + }, + two_hearts: { + keywords: [ "love", "like", "affection", "valentines", "heart" ], + "char": "\ud83d\udc95", + fitzpatrick_scale: false, + category: "symbols" + }, + revolving_hearts: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": "\ud83d\udc9e", + fitzpatrick_scale: false, + category: "symbols" + }, + heartbeat: { + keywords: [ "love", "like", "affection", "valentines", "pink", "heart" ], + "char": "\ud83d\udc93", + fitzpatrick_scale: false, + category: "symbols" + }, + heartpulse: { + keywords: [ "like", "love", "affection", "valentines", "pink" ], + "char": "\ud83d\udc97", + fitzpatrick_scale: false, + category: "symbols" + }, + sparkling_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + "char": "\ud83d\udc96", + fitzpatrick_scale: false, + category: "symbols" + }, + cupid: { + keywords: [ "love", "like", "heart", "affection", "valentines" ], + "char": "\ud83d\udc98", + fitzpatrick_scale: false, + category: "symbols" + }, + gift_heart: { + keywords: [ "love", "valentines" ], + "char": "\ud83d\udc9d", + fitzpatrick_scale: false, + category: "symbols" + }, + heart_decoration: { + keywords: [ "purple-square", "love", "like" ], + "char": "\ud83d\udc9f", + fitzpatrick_scale: false, + category: "symbols" + }, + peace_symbol: { + keywords: [ "hippie" ], + "char": "\u262e", + fitzpatrick_scale: false, + category: "symbols" + }, + latin_cross: { + keywords: [ "christianity" ], + "char": "\u271d", + fitzpatrick_scale: false, + category: "symbols" + }, + star_and_crescent: { + keywords: [ "islam" ], + "char": "\u262a", + fitzpatrick_scale: false, + category: "symbols" + }, + om: { + keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ], + "char": "\ud83d\udd49", + fitzpatrick_scale: false, + category: "symbols" + }, + wheel_of_dharma: { + keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ], + "char": "\u2638", + fitzpatrick_scale: false, + category: "symbols" + }, + star_of_david: { + keywords: [ "judaism" ], + "char": "\u2721", + fitzpatrick_scale: false, + category: "symbols" + }, + six_pointed_star: { + keywords: [ "purple-square", "religion", "jewish", "hexagram" ], + "char": "\ud83d\udd2f", + fitzpatrick_scale: false, + category: "symbols" + }, + menorah: { + keywords: [ "hanukkah", "candles", "jewish" ], + "char": "\ud83d\udd4e", + fitzpatrick_scale: false, + category: "symbols" + }, + yin_yang: { + keywords: [ "balance" ], + "char": "\u262f", + fitzpatrick_scale: false, + category: "symbols" + }, + orthodox_cross: { + keywords: [ "suppedaneum", "religion" ], + "char": "\u2626", + fitzpatrick_scale: false, + category: "symbols" + }, + place_of_worship: { + keywords: [ "religion", "church", "temple", "prayer" ], + "char": "\ud83d\uded0", + fitzpatrick_scale: false, + category: "symbols" + }, + ophiuchus: { + keywords: [ "sign", "purple-square", "constellation", "astrology" ], + "char": "\u26ce", + fitzpatrick_scale: false, + category: "symbols" + }, + aries: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + "char": "\u2648", + fitzpatrick_scale: false, + category: "symbols" + }, + taurus: { + keywords: [ "purple-square", "sign", "zodiac", "astrology" ], + "char": "\u2649", + fitzpatrick_scale: false, + category: "symbols" + }, + gemini: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + "char": "\u264a", + fitzpatrick_scale: false, + category: "symbols" + }, + cancer: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + "char": "\u264b", + fitzpatrick_scale: false, + category: "symbols" + }, + leo: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + "char": "\u264c", + fitzpatrick_scale: false, + category: "symbols" + }, + virgo: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + "char": "\u264d", + fitzpatrick_scale: false, + category: "symbols" + }, + libra: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + "char": "\u264e", + fitzpatrick_scale: false, + category: "symbols" + }, + scorpius: { + keywords: [ "sign", "zodiac", "purple-square", "astrology", "scorpio" ], + "char": "\u264f", + fitzpatrick_scale: false, + category: "symbols" + }, + sagittarius: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + "char": "\u2650", + fitzpatrick_scale: false, + category: "symbols" + }, + capricorn: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + "char": "\u2651", + fitzpatrick_scale: false, + category: "symbols" + }, + aquarius: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + "char": "\u2652", + fitzpatrick_scale: false, + category: "symbols" + }, + pisces: { + keywords: [ "purple-square", "sign", "zodiac", "astrology" ], + "char": "\u2653", + fitzpatrick_scale: false, + category: "symbols" + }, + id: { + keywords: [ "purple-square", "words" ], + "char": "\ud83c\udd94", + fitzpatrick_scale: false, + category: "symbols" + }, + atom_symbol: { + keywords: [ "science", "physics", "chemistry" ], + "char": "\u269b", + fitzpatrick_scale: false, + category: "symbols" + }, + u7a7a: { + keywords: [ "kanji", "japanese", "chinese", "empty", "sky", "blue-square" ], + "char": "\ud83c\ude33", + fitzpatrick_scale: false, + category: "symbols" + }, + u5272: { + keywords: [ "cut", "divide", "chinese", "kanji", "pink-square" ], + "char": "\ud83c\ude39", + fitzpatrick_scale: false, + category: "symbols" + }, + radioactive: { + keywords: [ "nuclear", "danger" ], + "char": "\u2622", + fitzpatrick_scale: false, + category: "symbols" + }, + biohazard: { + keywords: [ "danger" ], + "char": "\u2623", + fitzpatrick_scale: false, + category: "symbols" + }, + mobile_phone_off: { + keywords: [ "mute", "orange-square", "silence", "quiet" ], + "char": "\ud83d\udcf4", + fitzpatrick_scale: false, + category: "symbols" + }, + vibration_mode: { + keywords: [ "orange-square", "phone" ], + "char": "\ud83d\udcf3", + fitzpatrick_scale: false, + category: "symbols" + }, + u6709: { + keywords: [ "orange-square", "chinese", "have", "kanji" ], + "char": "\ud83c\ude36", + fitzpatrick_scale: false, + category: "symbols" + }, + u7121: { + keywords: [ "nothing", "chinese", "kanji", "japanese", "orange-square" ], + "char": "\ud83c\ude1a", + fitzpatrick_scale: false, + category: "symbols" + }, + u7533: { + keywords: [ "chinese", "japanese", "kanji", "orange-square" ], + "char": "\ud83c\ude38", + fitzpatrick_scale: false, + category: "symbols" + }, + u55b6: { + keywords: [ "japanese", "opening hours", "orange-square" ], + "char": "\ud83c\ude3a", + fitzpatrick_scale: false, + category: "symbols" + }, + u6708: { + keywords: [ "chinese", "month", "moon", "japanese", "orange-square", "kanji" ], + "char": "\ud83c\ude37\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + eight_pointed_black_star: { + keywords: [ "orange-square", "shape", "polygon" ], + "char": "\u2734\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + vs: { + keywords: [ "words", "orange-square" ], + "char": "\ud83c\udd9a", + fitzpatrick_scale: false, + category: "symbols" + }, + accept: { + keywords: [ "ok", "good", "chinese", "kanji", "agree", "yes", "orange-circle" ], + "char": "\ud83c\ude51", + fitzpatrick_scale: false, + category: "symbols" + }, + white_flower: { + keywords: [ "japanese", "spring" ], + "char": "\ud83d\udcae", + fitzpatrick_scale: false, + category: "symbols" + }, + ideograph_advantage: { + keywords: [ "chinese", "kanji", "obtain", "get", "circle" ], + "char": "\ud83c\ude50", + fitzpatrick_scale: false, + category: "symbols" + }, + secret: { + keywords: [ "privacy", "chinese", "sshh", "kanji", "red-circle" ], + "char": "\u3299\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + congratulations: { + keywords: [ "chinese", "kanji", "japanese", "red-circle" ], + "char": "\u3297\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + u5408: { + keywords: [ "japanese", "chinese", "join", "kanji", "red-square" ], + "char": "\ud83c\ude34", + fitzpatrick_scale: false, + category: "symbols" + }, + u6e80: { + keywords: [ "full", "chinese", "japanese", "red-square", "kanji" ], + "char": "\ud83c\ude35", + fitzpatrick_scale: false, + category: "symbols" + }, + u7981: { + keywords: [ "kanji", "japanese", "chinese", "forbidden", "limit", "restricted", "red-square" ], + "char": "\ud83c\ude32", + fitzpatrick_scale: false, + category: "symbols" + }, + a: { + keywords: [ "red-square", "alphabet", "letter" ], + "char": "\ud83c\udd70\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + b: { + keywords: [ "red-square", "alphabet", "letter" ], + "char": "\ud83c\udd71\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + ab: { + keywords: [ "red-square", "alphabet" ], + "char": "\ud83c\udd8e", + fitzpatrick_scale: false, + category: "symbols" + }, + cl: { + keywords: [ "alphabet", "words", "red-square" ], + "char": "\ud83c\udd91", + fitzpatrick_scale: false, + category: "symbols" + }, + o2: { + keywords: [ "alphabet", "red-square", "letter" ], + "char": "\ud83c\udd7e\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + sos: { + keywords: [ "help", "red-square", "words", "emergency", "911" ], + "char": "\ud83c\udd98", + fitzpatrick_scale: false, + category: "symbols" + }, + no_entry: { + keywords: [ "limit", "security", "privacy", "bad", "denied", "stop", "circle" ], + "char": "\u26d4", + fitzpatrick_scale: false, + category: "symbols" + }, + name_badge: { + keywords: [ "fire", "forbid" ], + "char": "\ud83d\udcdb", + fitzpatrick_scale: false, + category: "symbols" + }, + no_entry_sign: { + keywords: [ "forbid", "stop", "limit", "denied", "disallow", "circle" ], + "char": "\ud83d\udeab", + fitzpatrick_scale: false, + category: "symbols" + }, + x: { + keywords: [ "no", "delete", "remove", "cancel", "red" ], + "char": "\u274c", + fitzpatrick_scale: false, + category: "symbols" + }, + o: { + keywords: [ "circle", "round" ], + "char": "\u2b55", + fitzpatrick_scale: false, + category: "symbols" + }, + stop_sign: { + keywords: [ "stop" ], + "char": "\ud83d\uded1", + fitzpatrick_scale: false, + category: "symbols" + }, + anger: { + keywords: [ "angry", "mad" ], + "char": "\ud83d\udca2", + fitzpatrick_scale: false, + category: "symbols" + }, + hotsprings: { + keywords: [ "bath", "warm", "relax" ], + "char": "\u2668\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + no_pedestrians: { + keywords: [ "rules", "crossing", "walking", "circle" ], + "char": "\ud83d\udeb7", + fitzpatrick_scale: false, + category: "symbols" + }, + do_not_litter: { + keywords: [ "trash", "bin", "garbage", "circle" ], + "char": "\ud83d\udeaf", + fitzpatrick_scale: false, + category: "symbols" + }, + no_bicycles: { + keywords: [ "cyclist", "prohibited", "circle" ], + "char": "\ud83d\udeb3", + fitzpatrick_scale: false, + category: "symbols" + }, + "non-potable_water": { + keywords: [ "drink", "faucet", "tap", "circle" ], + "char": "\ud83d\udeb1", + fitzpatrick_scale: false, + category: "symbols" + }, + underage: { + keywords: [ "18", "drink", "pub", "night", "minor", "circle" ], + "char": "\ud83d\udd1e", + fitzpatrick_scale: false, + category: "symbols" + }, + no_mobile_phones: { + keywords: [ "iphone", "mute", "circle" ], + "char": "\ud83d\udcf5", + fitzpatrick_scale: false, + category: "symbols" + }, + exclamation: { + keywords: [ "heavy_exclamation_mark", "danger", "surprise", "punctuation", "wow", "warning" ], + "char": "\u2757", + fitzpatrick_scale: false, + category: "symbols" + }, + grey_exclamation: { + keywords: [ "surprise", "punctuation", "gray", "wow", "warning" ], + "char": "\u2755", + fitzpatrick_scale: false, + category: "symbols" + }, + question: { + keywords: [ "doubt", "confused" ], + "char": "\u2753", + fitzpatrick_scale: false, + category: "symbols" + }, + grey_question: { + keywords: [ "doubts", "gray", "huh", "confused" ], + "char": "\u2754", + fitzpatrick_scale: false, + category: "symbols" + }, + bangbang: { + keywords: [ "exclamation", "surprise" ], + "char": "\u203c\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + interrobang: { + keywords: [ "wat", "punctuation", "surprise" ], + "char": "\u2049\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + 100: { + keywords: [ "score", "perfect", "numbers", "century", "exam", "quiz", "test", "pass", "hundred" ], + "char": "\ud83d\udcaf", + fitzpatrick_scale: false, + category: "symbols" + }, + low_brightness: { + keywords: [ "sun", "afternoon", "warm", "summer" ], + "char": "\ud83d\udd05", + fitzpatrick_scale: false, + category: "symbols" + }, + high_brightness: { + keywords: [ "sun", "light" ], + "char": "\ud83d\udd06", + fitzpatrick_scale: false, + category: "symbols" + }, + trident: { + keywords: [ "weapon", "spear" ], + "char": "\ud83d\udd31", + fitzpatrick_scale: false, + category: "symbols" + }, + fleur_de_lis: { + keywords: [ "decorative", "scout" ], + "char": "\u269c", + fitzpatrick_scale: false, + category: "symbols" + }, + part_alternation_mark: { + keywords: [ "graph", "presentation", "stats", "business", "economics", "bad" ], + "char": "\u303d\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + warning: { + keywords: [ "exclamation", "wip", "alert", "error", "problem", "issue" ], + "char": "\u26a0\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + children_crossing: { + keywords: [ "school", "warning", "danger", "sign", "driving", "yellow-diamond" ], + "char": "\ud83d\udeb8", + fitzpatrick_scale: false, + category: "symbols" + }, + beginner: { + keywords: [ "badge", "shield" ], + "char": "\ud83d\udd30", + fitzpatrick_scale: false, + category: "symbols" + }, + recycle: { + keywords: [ "arrow", "environment", "garbage", "trash" ], + "char": "\u267b\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + u6307: { + keywords: [ "chinese", "point", "green-square", "kanji" ], + "char": "\ud83c\ude2f", + fitzpatrick_scale: false, + category: "symbols" + }, + chart: { + keywords: [ "green-square", "graph", "presentation", "stats" ], + "char": "\ud83d\udcb9", + fitzpatrick_scale: false, + category: "symbols" + }, + sparkle: { + keywords: [ "stars", "green-square", "awesome", "good", "fireworks" ], + "char": "\u2747\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + eight_spoked_asterisk: { + keywords: [ "star", "sparkle", "green-square" ], + "char": "\u2733\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + negative_squared_cross_mark: { + keywords: [ "x", "green-square", "no", "deny" ], + "char": "\u274e", + fitzpatrick_scale: false, + category: "symbols" + }, + white_check_mark: { + keywords: [ "green-square", "ok", "agree", "vote", "election", "answer", "tick" ], + "char": "\u2705", + fitzpatrick_scale: false, + category: "symbols" + }, + diamond_shape_with_a_dot_inside: { + keywords: [ "jewel", "blue", "gem", "crystal", "fancy" ], + "char": "\ud83d\udca0", + fitzpatrick_scale: false, + category: "symbols" + }, + cyclone: { + keywords: [ "weather", "swirl", "blue", "cloud", "vortex", "spiral", "whirlpool", "spin", "tornado", "hurricane", "typhoon" ], + "char": "\ud83c\udf00", + fitzpatrick_scale: false, + category: "symbols" + }, + loop: { + keywords: [ "tape", "cassette" ], + "char": "\u27bf", + fitzpatrick_scale: false, + category: "symbols" + }, + globe_with_meridians: { + keywords: [ "earth", "international", "world", "internet", "interweb", "i18n" ], + "char": "\ud83c\udf10", + fitzpatrick_scale: false, + category: "symbols" + }, + m: { + keywords: [ "alphabet", "blue-circle", "letter" ], + "char": "\u24c2\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + atm: { + keywords: [ "money", "sales", "cash", "blue-square", "payment", "bank" ], + "char": "\ud83c\udfe7", + fitzpatrick_scale: false, + category: "symbols" + }, + sa: { + keywords: [ "japanese", "blue-square", "katakana" ], + "char": "\ud83c\ude02\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + passport_control: { + keywords: [ "custom", "blue-square" ], + "char": "\ud83d\udec2", + fitzpatrick_scale: false, + category: "symbols" + }, + customs: { + keywords: [ "passport", "border", "blue-square" ], + "char": "\ud83d\udec3", + fitzpatrick_scale: false, + category: "symbols" + }, + baggage_claim: { + keywords: [ "blue-square", "airport", "transport" ], + "char": "\ud83d\udec4", + fitzpatrick_scale: false, + category: "symbols" + }, + left_luggage: { + keywords: [ "blue-square", "travel" ], + "char": "\ud83d\udec5", + fitzpatrick_scale: false, + category: "symbols" + }, + wheelchair: { + keywords: [ "blue-square", "disabled", "a11y", "accessibility" ], + "char": "\u267f", + fitzpatrick_scale: false, + category: "symbols" + }, + no_smoking: { + keywords: [ "cigarette", "blue-square", "smell", "smoke" ], + "char": "\ud83d\udead", + fitzpatrick_scale: false, + category: "symbols" + }, + wc: { + keywords: [ "toilet", "restroom", "blue-square" ], + "char": "\ud83d\udebe", + fitzpatrick_scale: false, + category: "symbols" + }, + parking: { + keywords: [ "cars", "blue-square", "alphabet", "letter" ], + "char": "\ud83c\udd7f\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + potable_water: { + keywords: [ "blue-square", "liquid", "restroom", "cleaning", "faucet" ], + "char": "\ud83d\udeb0", + fitzpatrick_scale: false, + category: "symbols" + }, + mens: { + keywords: [ "toilet", "restroom", "wc", "blue-square", "gender", "male" ], + "char": "\ud83d\udeb9", + fitzpatrick_scale: false, + category: "symbols" + }, + womens: { + keywords: [ "purple-square", "woman", "female", "toilet", "loo", "restroom", "gender" ], + "char": "\ud83d\udeba", + fitzpatrick_scale: false, + category: "symbols" + }, + baby_symbol: { + keywords: [ "orange-square", "child" ], + "char": "\ud83d\udebc", + fitzpatrick_scale: false, + category: "symbols" + }, + restroom: { + keywords: [ "blue-square", "toilet", "refresh", "wc", "gender" ], + "char": "\ud83d\udebb", + fitzpatrick_scale: false, + category: "symbols" + }, + put_litter_in_its_place: { + keywords: [ "blue-square", "sign", "human", "info" ], + "char": "\ud83d\udeae", + fitzpatrick_scale: false, + category: "symbols" + }, + cinema: { + keywords: [ "blue-square", "record", "film", "movie", "curtain", "stage", "theater" ], + "char": "\ud83c\udfa6", + fitzpatrick_scale: false, + category: "symbols" + }, + signal_strength: { + keywords: [ "blue-square", "reception", "phone", "internet", "connection", "wifi", "bluetooth", "bars" ], + "char": "\ud83d\udcf6", + fitzpatrick_scale: false, + category: "symbols" + }, + koko: { + keywords: [ "blue-square", "here", "katakana", "japanese", "destination" ], + "char": "\ud83c\ude01", + fitzpatrick_scale: false, + category: "symbols" + }, + ng: { + keywords: [ "blue-square", "words", "shape", "icon" ], + "char": "\ud83c\udd96", + fitzpatrick_scale: false, + category: "symbols" + }, + ok: { + keywords: [ "good", "agree", "yes", "blue-square" ], + "char": "\ud83c\udd97", + fitzpatrick_scale: false, + category: "symbols" + }, + up: { + keywords: [ "blue-square", "above", "high" ], + "char": "\ud83c\udd99", + fitzpatrick_scale: false, + category: "symbols" + }, + cool: { + keywords: [ "words", "blue-square" ], + "char": "\ud83c\udd92", + fitzpatrick_scale: false, + category: "symbols" + }, + "new": { + keywords: [ "blue-square", "words", "start" ], + "char": "\ud83c\udd95", + fitzpatrick_scale: false, + category: "symbols" + }, + free: { + keywords: [ "blue-square", "words" ], + "char": "\ud83c\udd93", + fitzpatrick_scale: false, + category: "symbols" + }, + zero: { + keywords: [ "0", "numbers", "blue-square", "null" ], + "char": "0\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + one: { + keywords: [ "blue-square", "numbers", "1" ], + "char": "1\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + two: { + keywords: [ "numbers", "2", "prime", "blue-square" ], + "char": "2\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + three: { + keywords: [ "3", "numbers", "prime", "blue-square" ], + "char": "3\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + four: { + keywords: [ "4", "numbers", "blue-square" ], + "char": "4\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + five: { + keywords: [ "5", "numbers", "blue-square", "prime" ], + "char": "5\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + six: { + keywords: [ "6", "numbers", "blue-square" ], + "char": "6\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + seven: { + keywords: [ "7", "numbers", "blue-square", "prime" ], + "char": "7\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + eight: { + keywords: [ "8", "blue-square", "numbers" ], + "char": "8\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + nine: { + keywords: [ "blue-square", "numbers", "9" ], + "char": "9\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + keycap_ten: { + keywords: [ "numbers", "10", "blue-square" ], + "char": "\ud83d\udd1f", + fitzpatrick_scale: false, + category: "symbols" + }, + asterisk: { + keywords: [ "star", "keycap" ], + "char": "*\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + 1234: { + keywords: [ "numbers", "blue-square" ], + "char": "\ud83d\udd22", + fitzpatrick_scale: false, + category: "symbols" + }, + eject_button: { + keywords: [ "blue-square" ], + "char": "\u23cf\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_forward: { + keywords: [ "blue-square", "right", "direction", "play" ], + "char": "\u25b6\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + pause_button: { + keywords: [ "pause", "blue-square" ], + "char": "\u23f8", + fitzpatrick_scale: false, + category: "symbols" + }, + next_track_button: { + keywords: [ "forward", "next", "blue-square" ], + "char": "\u23ed", + fitzpatrick_scale: false, + category: "symbols" + }, + stop_button: { + keywords: [ "blue-square" ], + "char": "\u23f9", + fitzpatrick_scale: false, + category: "symbols" + }, + record_button: { + keywords: [ "blue-square" ], + "char": "\u23fa", + fitzpatrick_scale: false, + category: "symbols" + }, + play_or_pause_button: { + keywords: [ "blue-square", "play", "pause" ], + "char": "\u23ef", + fitzpatrick_scale: false, + category: "symbols" + }, + previous_track_button: { + keywords: [ "backward" ], + "char": "\u23ee", + fitzpatrick_scale: false, + category: "symbols" + }, + fast_forward: { + keywords: [ "blue-square", "play", "speed", "continue" ], + "char": "\u23e9", + fitzpatrick_scale: false, + category: "symbols" + }, + rewind: { + keywords: [ "play", "blue-square" ], + "char": "\u23ea", + fitzpatrick_scale: false, + category: "symbols" + }, + twisted_rightwards_arrows: { + keywords: [ "blue-square", "shuffle", "music", "random" ], + "char": "\ud83d\udd00", + fitzpatrick_scale: false, + category: "symbols" + }, + repeat: { + keywords: [ "loop", "record" ], + "char": "\ud83d\udd01", + fitzpatrick_scale: false, + category: "symbols" + }, + repeat_one: { + keywords: [ "blue-square", "loop" ], + "char": "\ud83d\udd02", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_backward: { + keywords: [ "blue-square", "left", "direction" ], + "char": "\u25c0\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up_small: { + keywords: [ "blue-square", "triangle", "direction", "point", "forward", "top" ], + "char": "\ud83d\udd3c", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_down_small: { + keywords: [ "blue-square", "direction", "bottom" ], + "char": "\ud83d\udd3d", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_double_up: { + keywords: [ "blue-square", "direction", "top" ], + "char": "\u23eb", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_double_down: { + keywords: [ "blue-square", "direction", "bottom" ], + "char": "\u23ec", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_right: { + keywords: [ "blue-square", "next" ], + "char": "\u27a1\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_left: { + keywords: [ "blue-square", "previous", "back" ], + "char": "\u2b05\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up: { + keywords: [ "blue-square", "continue", "top", "direction" ], + "char": "\u2b06\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_down: { + keywords: [ "blue-square", "direction", "bottom" ], + "char": "\u2b07\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_upper_right: { + keywords: [ "blue-square", "point", "direction", "diagonal", "northeast" ], + "char": "\u2197\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_lower_right: { + keywords: [ "blue-square", "direction", "diagonal", "southeast" ], + "char": "\u2198\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_lower_left: { + keywords: [ "blue-square", "direction", "diagonal", "southwest" ], + "char": "\u2199\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_upper_left: { + keywords: [ "blue-square", "point", "direction", "diagonal", "northwest" ], + "char": "\u2196\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up_down: { + keywords: [ "blue-square", "direction", "way", "vertical" ], + "char": "\u2195\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + left_right_arrow: { + keywords: [ "shape", "direction", "horizontal", "sideways" ], + "char": "\u2194\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrows_counterclockwise: { + keywords: [ "blue-square", "sync", "cycle" ], + "char": "\ud83d\udd04", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_right_hook: { + keywords: [ "blue-square", "return", "rotate", "direction" ], + "char": "\u21aa\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + leftwards_arrow_with_hook: { + keywords: [ "back", "return", "blue-square", "undo", "enter" ], + "char": "\u21a9\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_heading_up: { + keywords: [ "blue-square", "direction", "top" ], + "char": "\u2934\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_heading_down: { + keywords: [ "blue-square", "direction", "bottom" ], + "char": "\u2935\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + hash: { + keywords: [ "symbol", "blue-square", "twitter" ], + "char": "#\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + information_source: { + keywords: [ "blue-square", "alphabet", "letter" ], + "char": "\u2139\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + abc: { + keywords: [ "blue-square", "alphabet" ], + "char": "\ud83d\udd24", + fitzpatrick_scale: false, + category: "symbols" + }, + abcd: { + keywords: [ "blue-square", "alphabet" ], + "char": "\ud83d\udd21", + fitzpatrick_scale: false, + category: "symbols" + }, + capital_abcd: { + keywords: [ "alphabet", "words", "blue-square" ], + "char": "\ud83d\udd20", + fitzpatrick_scale: false, + category: "symbols" + }, + symbols: { + keywords: [ "blue-square", "music", "note", "ampersand", "percent", "glyphs", "characters" ], + "char": "\ud83d\udd23", + fitzpatrick_scale: false, + category: "symbols" + }, + musical_note: { + keywords: [ "score", "tone", "sound" ], + "char": "\ud83c\udfb5", + fitzpatrick_scale: false, + category: "symbols" + }, + notes: { + keywords: [ "music", "score" ], + "char": "\ud83c\udfb6", + fitzpatrick_scale: false, + category: "symbols" + }, + wavy_dash: { + keywords: [ "draw", "line", "moustache", "mustache", "squiggle", "scribble" ], + "char": "\u3030\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + curly_loop: { + keywords: [ "scribble", "draw", "shape", "squiggle" ], + "char": "\u27b0", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_check_mark: { + keywords: [ "ok", "nike", "answer", "yes", "tick" ], + "char": "\u2714\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrows_clockwise: { + keywords: [ "sync", "cycle", "round", "repeat" ], + "char": "\ud83d\udd03", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_plus_sign: { + keywords: [ "math", "calculation", "addition", "more", "increase" ], + "char": "\u2795", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_minus_sign: { + keywords: [ "math", "calculation", "subtract", "less" ], + "char": "\u2796", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_division_sign: { + keywords: [ "divide", "math", "calculation" ], + "char": "\u2797", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_multiplication_x: { + keywords: [ "math", "calculation" ], + "char": "\u2716\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + infinity: { + keywords: [ "forever" ], + "char": "\u267e", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_dollar_sign: { + keywords: [ "money", "sales", "payment", "currency", "buck" ], + "char": "\ud83d\udcb2", + fitzpatrick_scale: false, + category: "symbols" + }, + currency_exchange: { + keywords: [ "money", "sales", "dollar", "travel" ], + "char": "\ud83d\udcb1", + fitzpatrick_scale: false, + category: "symbols" + }, + copyright: { + keywords: [ "ip", "license", "circle", "law", "legal" ], + "char": "\xa9\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + registered: { + keywords: [ "alphabet", "circle" ], + "char": "\xae\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + tm: { + keywords: [ "trademark", "brand", "law", "legal" ], + "char": "\u2122\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + end: { + keywords: [ "words", "arrow" ], + "char": "\ud83d\udd1a", + fitzpatrick_scale: false, + category: "symbols" + }, + back: { + keywords: [ "arrow", "words", "return" ], + "char": "\ud83d\udd19", + fitzpatrick_scale: false, + category: "symbols" + }, + on: { + keywords: [ "arrow", "words" ], + "char": "\ud83d\udd1b", + fitzpatrick_scale: false, + category: "symbols" + }, + top: { + keywords: [ "words", "blue-square" ], + "char": "\ud83d\udd1d", + fitzpatrick_scale: false, + category: "symbols" + }, + soon: { + keywords: [ "arrow", "words" ], + "char": "\ud83d\udd1c", + fitzpatrick_scale: false, + category: "symbols" + }, + ballot_box_with_check: { + keywords: [ "ok", "agree", "confirm", "black-square", "vote", "election", "yes", "tick" ], + "char": "\u2611\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + radio_button: { + keywords: [ "input", "old", "music", "circle" ], + "char": "\ud83d\udd18", + fitzpatrick_scale: false, + category: "symbols" + }, + white_circle: { + keywords: [ "shape", "round" ], + "char": "\u26aa", + fitzpatrick_scale: false, + category: "symbols" + }, + black_circle: { + keywords: [ "shape", "button", "round" ], + "char": "\u26ab", + fitzpatrick_scale: false, + category: "symbols" + }, + red_circle: { + keywords: [ "shape", "error", "danger" ], + "char": "\ud83d\udd34", + fitzpatrick_scale: false, + category: "symbols" + }, + large_blue_circle: { + keywords: [ "shape", "icon", "button" ], + "char": "\ud83d\udd35", + fitzpatrick_scale: false, + category: "symbols" + }, + small_orange_diamond: { + keywords: [ "shape", "jewel", "gem" ], + "char": "\ud83d\udd38", + fitzpatrick_scale: false, + category: "symbols" + }, + small_blue_diamond: { + keywords: [ "shape", "jewel", "gem" ], + "char": "\ud83d\udd39", + fitzpatrick_scale: false, + category: "symbols" + }, + large_orange_diamond: { + keywords: [ "shape", "jewel", "gem" ], + "char": "\ud83d\udd36", + fitzpatrick_scale: false, + category: "symbols" + }, + large_blue_diamond: { + keywords: [ "shape", "jewel", "gem" ], + "char": "\ud83d\udd37", + fitzpatrick_scale: false, + category: "symbols" + }, + small_red_triangle: { + keywords: [ "shape", "direction", "up", "top" ], + "char": "\ud83d\udd3a", + fitzpatrick_scale: false, + category: "symbols" + }, + black_small_square: { + keywords: [ "shape", "icon" ], + "char": "\u25aa\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + white_small_square: { + keywords: [ "shape", "icon" ], + "char": "\u25ab\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + black_large_square: { + keywords: [ "shape", "icon", "button" ], + "char": "\u2b1b", + fitzpatrick_scale: false, + category: "symbols" + }, + white_large_square: { + keywords: [ "shape", "icon", "stone", "button" ], + "char": "\u2b1c", + fitzpatrick_scale: false, + category: "symbols" + }, + small_red_triangle_down: { + keywords: [ "shape", "direction", "bottom" ], + "char": "\ud83d\udd3b", + fitzpatrick_scale: false, + category: "symbols" + }, + black_medium_square: { + keywords: [ "shape", "button", "icon" ], + "char": "\u25fc\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + white_medium_square: { + keywords: [ "shape", "stone", "icon" ], + "char": "\u25fb\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + black_medium_small_square: { + keywords: [ "icon", "shape", "button" ], + "char": "\u25fe", + fitzpatrick_scale: false, + category: "symbols" + }, + white_medium_small_square: { + keywords: [ "shape", "stone", "icon", "button" ], + "char": "\u25fd", + fitzpatrick_scale: false, + category: "symbols" + }, + black_square_button: { + keywords: [ "shape", "input", "frame" ], + "char": "\ud83d\udd32", + fitzpatrick_scale: false, + category: "symbols" + }, + white_square_button: { + keywords: [ "shape", "input" ], + "char": "\ud83d\udd33", + fitzpatrick_scale: false, + category: "symbols" + }, + speaker: { + keywords: [ "sound", "volume", "silence", "broadcast" ], + "char": "\ud83d\udd08", + fitzpatrick_scale: false, + category: "symbols" + }, + sound: { + keywords: [ "volume", "speaker", "broadcast" ], + "char": "\ud83d\udd09", + fitzpatrick_scale: false, + category: "symbols" + }, + loud_sound: { + keywords: [ "volume", "noise", "noisy", "speaker", "broadcast" ], + "char": "\ud83d\udd0a", + fitzpatrick_scale: false, + category: "symbols" + }, + mute: { + keywords: [ "sound", "volume", "silence", "quiet" ], + "char": "\ud83d\udd07", + fitzpatrick_scale: false, + category: "symbols" + }, + mega: { + keywords: [ "sound", "speaker", "volume" ], + "char": "\ud83d\udce3", + fitzpatrick_scale: false, + category: "symbols" + }, + loudspeaker: { + keywords: [ "volume", "sound" ], + "char": "\ud83d\udce2", + fitzpatrick_scale: false, + category: "symbols" + }, + bell: { + keywords: [ "sound", "notification", "christmas", "xmas", "chime" ], + "char": "\ud83d\udd14", + fitzpatrick_scale: false, + category: "symbols" + }, + no_bell: { + keywords: [ "sound", "volume", "mute", "quiet", "silent" ], + "char": "\ud83d\udd15", + fitzpatrick_scale: false, + category: "symbols" + }, + black_joker: { + keywords: [ "poker", "cards", "game", "play", "magic" ], + "char": "\ud83c\udccf", + fitzpatrick_scale: false, + category: "symbols" + }, + mahjong: { + keywords: [ "game", "play", "chinese", "kanji" ], + "char": "\ud83c\udc04", + fitzpatrick_scale: false, + category: "symbols" + }, + spades: { + keywords: [ "poker", "cards", "suits", "magic" ], + "char": "\u2660\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + clubs: { + keywords: [ "poker", "cards", "magic", "suits" ], + "char": "\u2663\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + hearts: { + keywords: [ "poker", "cards", "magic", "suits" ], + "char": "\u2665\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + diamonds: { + keywords: [ "poker", "cards", "magic", "suits" ], + "char": "\u2666\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + flower_playing_cards: { + keywords: [ "game", "sunset", "red" ], + "char": "\ud83c\udfb4", + fitzpatrick_scale: false, + category: "symbols" + }, + thought_balloon: { + keywords: [ "bubble", "cloud", "speech", "thinking", "dream" ], + "char": "\ud83d\udcad", + fitzpatrick_scale: false, + category: "symbols" + }, + right_anger_bubble: { + keywords: [ "caption", "speech", "thinking", "mad" ], + "char": "\ud83d\uddef", + fitzpatrick_scale: false, + category: "symbols" + }, + speech_balloon: { + keywords: [ "bubble", "words", "message", "talk", "chatting" ], + "char": "\ud83d\udcac", + fitzpatrick_scale: false, + category: "symbols" + }, + left_speech_bubble: { + keywords: [ "words", "message", "talk", "chatting" ], + "char": "\ud83d\udde8", + fitzpatrick_scale: false, + category: "symbols" + }, + clock1: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd50", + fitzpatrick_scale: false, + category: "symbols" + }, + clock2: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd51", + fitzpatrick_scale: false, + category: "symbols" + }, + clock3: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd52", + fitzpatrick_scale: false, + category: "symbols" + }, + clock4: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd53", + fitzpatrick_scale: false, + category: "symbols" + }, + clock5: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd54", + fitzpatrick_scale: false, + category: "symbols" + }, + clock6: { + keywords: [ "time", "late", "early", "schedule", "dawn", "dusk" ], + "char": "\ud83d\udd55", + fitzpatrick_scale: false, + category: "symbols" + }, + clock7: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd56", + fitzpatrick_scale: false, + category: "symbols" + }, + clock8: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd57", + fitzpatrick_scale: false, + category: "symbols" + }, + clock9: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd58", + fitzpatrick_scale: false, + category: "symbols" + }, + clock10: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd59", + fitzpatrick_scale: false, + category: "symbols" + }, + clock11: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd5a", + fitzpatrick_scale: false, + category: "symbols" + }, + clock12: { + keywords: [ "time", "noon", "midnight", "midday", "late", "early", "schedule" ], + "char": "\ud83d\udd5b", + fitzpatrick_scale: false, + category: "symbols" + }, + clock130: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd5c", + fitzpatrick_scale: false, + category: "symbols" + }, + clock230: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd5d", + fitzpatrick_scale: false, + category: "symbols" + }, + clock330: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd5e", + fitzpatrick_scale: false, + category: "symbols" + }, + clock430: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd5f", + fitzpatrick_scale: false, + category: "symbols" + }, + clock530: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd60", + fitzpatrick_scale: false, + category: "symbols" + }, + clock630: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd61", + fitzpatrick_scale: false, + category: "symbols" + }, + clock730: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd62", + fitzpatrick_scale: false, + category: "symbols" + }, + clock830: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd63", + fitzpatrick_scale: false, + category: "symbols" + }, + clock930: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd64", + fitzpatrick_scale: false, + category: "symbols" + }, + clock1030: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd65", + fitzpatrick_scale: false, + category: "symbols" + }, + clock1130: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd66", + fitzpatrick_scale: false, + category: "symbols" + }, + clock1230: { + keywords: [ "time", "late", "early", "schedule" ], + "char": "\ud83d\udd67", + fitzpatrick_scale: false, + category: "symbols" + }, + afghanistan: { + keywords: [ "af", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + aland_islands: { + keywords: [ "\xc5land", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddfd", + fitzpatrick_scale: false, + category: "flags" + }, + albania: { + keywords: [ "al", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + algeria: { + keywords: [ "dz", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde9\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + american_samoa: { + keywords: [ "american", "ws", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + andorra: { + keywords: [ "ad", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + angola: { + keywords: [ "ao", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + anguilla: { + keywords: [ "ai", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + antarctica: { + keywords: [ "aq", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddf6", + fitzpatrick_scale: false, + category: "flags" + }, + antigua_barbuda: { + keywords: [ "antigua", "barbuda", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + argentina: { + keywords: [ "ar", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + armenia: { + keywords: [ "am", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + aruba: { + keywords: [ "aw", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + australia: { + keywords: [ "au", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + austria: { + keywords: [ "at", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + azerbaijan: { + keywords: [ "az", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + bahamas: { + keywords: [ "bs", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + bahrain: { + keywords: [ "bh", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + bangladesh: { + keywords: [ "bd", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + barbados: { + keywords: [ "bb", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\udde7", + fitzpatrick_scale: false, + category: "flags" + }, + belarus: { + keywords: [ "by", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + belgium: { + keywords: [ "be", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + belize: { + keywords: [ "bz", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + benin: { + keywords: [ "bj", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddef", + fitzpatrick_scale: false, + category: "flags" + }, + bermuda: { + keywords: [ "bm", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + bhutan: { + keywords: [ "bt", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + bolivia: { + keywords: [ "bo", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + caribbean_netherlands: { + keywords: [ "bonaire", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddf6", + fitzpatrick_scale: false, + category: "flags" + }, + bosnia_herzegovina: { + keywords: [ "bosnia", "herzegovina", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + botswana: { + keywords: [ "bw", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + brazil: { + keywords: [ "br", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + british_indian_ocean_territory: { + keywords: [ "british", "indian", "ocean", "territory", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + british_virgin_islands: { + keywords: [ "british", "virgin", "islands", "bvi", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfb\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + brunei: { + keywords: [ "bn", "darussalam", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + bulgaria: { + keywords: [ "bg", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + burkina_faso: { + keywords: [ "burkina", "faso", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + burundi: { + keywords: [ "bi", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + cape_verde: { + keywords: [ "cabo", "verde", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddfb", + fitzpatrick_scale: false, + category: "flags" + }, + cambodia: { + keywords: [ "kh", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + cameroon: { + keywords: [ "cm", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + canada: { + keywords: [ "ca", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + canary_islands: { + keywords: [ "canary", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + cayman_islands: { + keywords: [ "cayman", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + central_african_republic: { + keywords: [ "central", "african", "republic", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + chad: { + keywords: [ "td", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + chile: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + cn: { + keywords: [ "china", "chinese", "prc", "flag", "country", "nation", "banner" ], + "char": "\ud83c\udde8\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + christmas_island: { + keywords: [ "christmas", "island", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddfd", + fitzpatrick_scale: false, + category: "flags" + }, + cocos_islands: { + keywords: [ "cocos", "keeling", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + colombia: { + keywords: [ "co", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + comoros: { + keywords: [ "km", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + congo_brazzaville: { + keywords: [ "congo", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + congo_kinshasa: { + keywords: [ "congo", "democratic", "republic", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + cook_islands: { + keywords: [ "cook", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + costa_rica: { + keywords: [ "costa", "rica", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + croatia: { + keywords: [ "hr", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udded\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + cuba: { + keywords: [ "cu", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + curacao: { + keywords: [ "cura\xe7ao", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + cyprus: { + keywords: [ "cy", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + czech_republic: { + keywords: [ "cz", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + denmark: { + keywords: [ "dk", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde9\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + djibouti: { + keywords: [ "dj", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde9\ud83c\uddef", + fitzpatrick_scale: false, + category: "flags" + }, + dominica: { + keywords: [ "dm", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde9\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + dominican_republic: { + keywords: [ "dominican", "republic", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde9\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + ecuador: { + keywords: [ "ec", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddea\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + egypt: { + keywords: [ "eg", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddea\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + el_salvador: { + keywords: [ "el", "salvador", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddfb", + fitzpatrick_scale: false, + category: "flags" + }, + equatorial_guinea: { + keywords: [ "equatorial", "gn", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddf6", + fitzpatrick_scale: false, + category: "flags" + }, + eritrea: { + keywords: [ "er", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddea\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + estonia: { + keywords: [ "ee", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddea\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + ethiopia: { + keywords: [ "et", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddea\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + eu: { + keywords: [ "european", "union", "flag", "banner" ], + "char": "\ud83c\uddea\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + falkland_islands: { + keywords: [ "falkland", "islands", "malvinas", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddeb\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + faroe_islands: { + keywords: [ "faroe", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddeb\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + fiji: { + keywords: [ "fj", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddeb\ud83c\uddef", + fitzpatrick_scale: false, + category: "flags" + }, + finland: { + keywords: [ "fi", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddeb\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + fr: { + keywords: [ "banner", "flag", "nation", "france", "french", "country" ], + "char": "\ud83c\uddeb\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + french_guiana: { + keywords: [ "french", "guiana", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + french_polynesia: { + keywords: [ "french", "polynesia", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + french_southern_territories: { + keywords: [ "french", "southern", "territories", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + gabon: { + keywords: [ "ga", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + gambia: { + keywords: [ "gm", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + georgia: { + keywords: [ "ge", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + de: { + keywords: [ "german", "nation", "flag", "country", "banner" ], + "char": "\ud83c\udde9\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + ghana: { + keywords: [ "gh", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + gibraltar: { + keywords: [ "gi", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + greece: { + keywords: [ "gr", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + greenland: { + keywords: [ "gl", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + grenada: { + keywords: [ "gd", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + guadeloupe: { + keywords: [ "gp", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddf5", + fitzpatrick_scale: false, + category: "flags" + }, + guam: { + keywords: [ "gu", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + guatemala: { + keywords: [ "gt", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + guernsey: { + keywords: [ "gg", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + guinea: { + keywords: [ "gn", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + guinea_bissau: { + keywords: [ "gw", "bissau", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + guyana: { + keywords: [ "gy", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + haiti: { + keywords: [ "ht", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udded\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + honduras: { + keywords: [ "hn", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udded\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + hong_kong: { + keywords: [ "hong", "kong", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udded\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + hungary: { + keywords: [ "hu", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udded\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + iceland: { + keywords: [ "is", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + india: { + keywords: [ "in", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + indonesia: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + iran: { + keywords: [ "iran,", "islamic", "republic", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + iraq: { + keywords: [ "iq", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\uddf6", + fitzpatrick_scale: false, + category: "flags" + }, + ireland: { + keywords: [ "ie", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + isle_of_man: { + keywords: [ "isle", "man", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + israel: { + keywords: [ "il", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + it: { + keywords: [ "italy", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddee\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + cote_divoire: { + keywords: [ "ivory", "coast", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + jamaica: { + keywords: [ "jm", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddef\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + jp: { + keywords: [ "japanese", "nation", "flag", "country", "banner" ], + "char": "\ud83c\uddef\ud83c\uddf5", + fitzpatrick_scale: false, + category: "flags" + }, + jersey: { + keywords: [ "je", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddef\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + jordan: { + keywords: [ "jo", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddef\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + kazakhstan: { + keywords: [ "kz", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + kenya: { + keywords: [ "ke", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + kiribati: { + keywords: [ "ki", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + kosovo: { + keywords: [ "xk", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfd\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + kuwait: { + keywords: [ "kw", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + kyrgyzstan: { + keywords: [ "kg", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + laos: { + keywords: [ "lao", "democratic", "republic", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + latvia: { + keywords: [ "lv", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\uddfb", + fitzpatrick_scale: false, + category: "flags" + }, + lebanon: { + keywords: [ "lb", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\udde7", + fitzpatrick_scale: false, + category: "flags" + }, + lesotho: { + keywords: [ "ls", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + liberia: { + keywords: [ "lr", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + libya: { + keywords: [ "ly", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + liechtenstein: { + keywords: [ "li", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + lithuania: { + keywords: [ "lt", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + luxembourg: { + keywords: [ "lu", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + macau: { + keywords: [ "macao", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + macedonia: { + keywords: [ "macedonia,", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + madagascar: { + keywords: [ "mg", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + malawi: { + keywords: [ "mw", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + malaysia: { + keywords: [ "my", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + maldives: { + keywords: [ "mv", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddfb", + fitzpatrick_scale: false, + category: "flags" + }, + mali: { + keywords: [ "ml", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + malta: { + keywords: [ "mt", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + marshall_islands: { + keywords: [ "marshall", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + martinique: { + keywords: [ "mq", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddf6", + fitzpatrick_scale: false, + category: "flags" + }, + mauritania: { + keywords: [ "mr", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + mauritius: { + keywords: [ "mu", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + mayotte: { + keywords: [ "yt", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfe\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + mexico: { + keywords: [ "mx", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddfd", + fitzpatrick_scale: false, + category: "flags" + }, + micronesia: { + keywords: [ "micronesia,", "federated", "states", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddeb\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + moldova: { + keywords: [ "moldova,", "republic", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + monaco: { + keywords: [ "mc", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + mongolia: { + keywords: [ "mn", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + montenegro: { + keywords: [ "me", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + montserrat: { + keywords: [ "ms", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + morocco: { + keywords: [ "ma", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + mozambique: { + keywords: [ "mz", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + myanmar: { + keywords: [ "mm", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + namibia: { + keywords: [ "na", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + nauru: { + keywords: [ "nr", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + nepal: { + keywords: [ "np", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\uddf5", + fitzpatrick_scale: false, + category: "flags" + }, + netherlands: { + keywords: [ "nl", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + new_caledonia: { + keywords: [ "new", "caledonia", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + new_zealand: { + keywords: [ "new", "zealand", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + nicaragua: { + keywords: [ "ni", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + niger: { + keywords: [ "ne", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + nigeria: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + niue: { + keywords: [ "nu", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + norfolk_island: { + keywords: [ "norfolk", "island", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + northern_mariana_islands: { + keywords: [ "northern", "mariana", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf2\ud83c\uddf5", + fitzpatrick_scale: false, + category: "flags" + }, + north_korea: { + keywords: [ "north", "korea", "nation", "flag", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\uddf5", + fitzpatrick_scale: false, + category: "flags" + }, + norway: { + keywords: [ "no", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf3\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + oman: { + keywords: [ "om_symbol", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf4\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + pakistan: { + keywords: [ "pk", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + palau: { + keywords: [ "pw", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + palestinian_territories: { + keywords: [ "palestine", "palestinian", "territories", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + panama: { + keywords: [ "pa", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + papua_new_guinea: { + keywords: [ "papua", "new", "guinea", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + paraguay: { + keywords: [ "py", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + peru: { + keywords: [ "pe", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + philippines: { + keywords: [ "ph", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + pitcairn_islands: { + keywords: [ "pitcairn", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + poland: { + keywords: [ "pl", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + portugal: { + keywords: [ "pt", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + puerto_rico: { + keywords: [ "puerto", "rico", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + qatar: { + keywords: [ "qa", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf6\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + reunion: { + keywords: [ "r\xe9union", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf7\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + romania: { + keywords: [ "ro", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf7\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + ru: { + keywords: [ "russian", "federation", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf7\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + rwanda: { + keywords: [ "rw", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf7\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + st_barthelemy: { + keywords: [ "saint", "barth\xe9lemy", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde7\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + st_helena: { + keywords: [ "saint", "helena", "ascension", "tristan", "cunha", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + st_kitts_nevis: { + keywords: [ "saint", "kitts", "nevis", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + st_lucia: { + keywords: [ "saint", "lucia", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + st_pierre_miquelon: { + keywords: [ "saint", "pierre", "miquelon", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf5\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + st_vincent_grenadines: { + keywords: [ "saint", "vincent", "grenadines", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfb\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + samoa: { + keywords: [ "ws", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfc\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + san_marino: { + keywords: [ "san", "marino", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + sao_tome_principe: { + keywords: [ "sao", "tome", "principe", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + saudi_arabia: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + senegal: { + keywords: [ "sn", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + serbia: { + keywords: [ "rs", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf7\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + seychelles: { + keywords: [ "sc", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + sierra_leone: { + keywords: [ "sierra", "leone", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + singapore: { + keywords: [ "sg", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + sint_maarten: { + keywords: [ "sint", "maarten", "dutch", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddfd", + fitzpatrick_scale: false, + category: "flags" + }, + slovakia: { + keywords: [ "sk", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + slovenia: { + keywords: [ "si", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + solomon_islands: { + keywords: [ "solomon", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\udde7", + fitzpatrick_scale: false, + category: "flags" + }, + somalia: { + keywords: [ "so", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + south_africa: { + keywords: [ "south", "africa", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddff\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + south_georgia_south_sandwich_islands: { + keywords: [ "south", "georgia", "sandwich", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddec\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + kr: { + keywords: [ "south", "korea", "nation", "flag", "country", "banner" ], + "char": "\ud83c\uddf0\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + south_sudan: { + keywords: [ "south", "sd", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + es: { + keywords: [ "spain", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddea\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + sri_lanka: { + keywords: [ "sri", "lanka", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf1\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + sudan: { + keywords: [ "sd", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + suriname: { + keywords: [ "sr", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + swaziland: { + keywords: [ "sz", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + sweden: { + keywords: [ "se", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + switzerland: { + keywords: [ "ch", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde8\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + syria: { + keywords: [ "syrian", "arab", "republic", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf8\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + taiwan: { + keywords: [ "tw", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + tajikistan: { + keywords: [ "tj", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddef", + fitzpatrick_scale: false, + category: "flags" + }, + tanzania: { + keywords: [ "tanzania,", "united", "republic", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + thailand: { + keywords: [ "th", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + timor_leste: { + keywords: [ "timor", "leste", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + togo: { + keywords: [ "tg", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + tokelau: { + keywords: [ "tk", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + tonga: { + keywords: [ "to", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + trinidad_tobago: { + keywords: [ "trinidad", "tobago", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + tunisia: { + keywords: [ "tn", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + tr: { + keywords: [ "turkey", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + turkmenistan: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + turks_caicos_islands: { + keywords: [ "turks", "caicos", "islands", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + tuvalu: { + keywords: [ "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddf9\ud83c\uddfb", + fitzpatrick_scale: false, + category: "flags" + }, + uganda: { + keywords: [ "ug", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfa\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + ukraine: { + keywords: [ "ua", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfa\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + united_arab_emirates: { + keywords: [ "united", "arab", "emirates", "flag", "nation", "country", "banner" ], + "char": "\ud83c\udde6\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + uk: { + keywords: [ "united", "kingdom", "great", "britain", "northern", "ireland", "flag", "nation", "country", "banner", "british", "UK", "english", "england", "union jack" ], + "char": "\ud83c\uddec\ud83c\udde7", + fitzpatrick_scale: false, + category: "flags" + }, + england: { + keywords: [ "flag", "english" ], + "char": "\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f", + fitzpatrick_scale: false, + category: "flags" + }, + scotland: { + keywords: [ "flag", "scottish" ], + "char": "\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f", + fitzpatrick_scale: false, + category: "flags" + }, + wales: { + keywords: [ "flag", "welsh" ], + "char": "\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f", + fitzpatrick_scale: false, + category: "flags" + }, + us: { + keywords: [ "united", "states", "america", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfa\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + us_virgin_islands: { + keywords: [ "virgin", "islands", "us", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfb\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + uruguay: { + keywords: [ "uy", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfa\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + uzbekistan: { + keywords: [ "uz", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfa\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + vanuatu: { + keywords: [ "vu", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfb\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + vatican_city: { + keywords: [ "vatican", "city", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfb\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + venezuela: { + keywords: [ "ve", "bolivarian", "republic", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfb\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + vietnam: { + keywords: [ "viet", "nam", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfb\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + wallis_futuna: { + keywords: [ "wallis", "futuna", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfc\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + western_sahara: { + keywords: [ "western", "sahara", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddea\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + yemen: { + keywords: [ "ye", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddfe\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + zambia: { + keywords: [ "zm", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddff\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + zimbabwe: { + keywords: [ "zw", "flag", "nation", "country", "banner" ], + "char": "\ud83c\uddff\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + united_nations: { + keywords: [ "un", "flag", "banner" ], + "char": "\ud83c\uddfa\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + pirate_flag: { + keywords: [ "skull", "crossbones", "flag", "banner" ], + "char": "\ud83c\udff4\u200d\u2620\ufe0f", + fitzpatrick_scale: false, + category: "flags" + } +}); \ No newline at end of file diff --git a/src/assets/tinymce/plugins/emoticons/js/emojis.min.js b/src/assets/tinymce/plugins/emoticons/js/emojis.min.js new file mode 100644 index 00000000..8295d5a5 --- /dev/null +++ b/src/assets/tinymce/plugins/emoticons/js/emojis.min.js @@ -0,0 +1,2 @@ +// Source: npm package: emojilib, file:emojis.json +window.tinymce.Resource.add("tinymce.plugins.emoticons",{grinning:{keywords:["face","smile","happy","joy",":D","grin"],"char":"\ud83d\ude00",fitzpatrick_scale:!1,category:"people"},grimacing:{keywords:["face","grimace","teeth"],"char":"\ud83d\ude2c",fitzpatrick_scale:!1,category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],"char":"\ud83d\ude01",fitzpatrick_scale:!1,category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],"char":"\ud83d\ude02",fitzpatrick_scale:!1,category:"people"},rofl:{keywords:["face","rolling","floor","laughing","lol","haha"],"char":"\ud83e\udd23",fitzpatrick_scale:!1,category:"people"},partying:{keywords:["face","celebration","woohoo"],"char":"\ud83e\udd73",fitzpatrick_scale:!1,category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],"char":"\ud83d\ude03",fitzpatrick_scale:!1,category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],"char":"\ud83d\ude04",fitzpatrick_scale:!1,category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],"char":"\ud83d\ude05",fitzpatrick_scale:!1,category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],"char":"\ud83d\ude06",fitzpatrick_scale:!1,category:"people"},innocent:{keywords:["face","angel","heaven","halo"],"char":"\ud83d\ude07",fitzpatrick_scale:!1,category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile","eye"],"char":"\ud83d\ude09",fitzpatrick_scale:!1,category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],"char":"\ud83d\ude0a",fitzpatrick_scale:!1,category:"people"},slightly_smiling_face:{keywords:["face","smile"],"char":"\ud83d\ude42",fitzpatrick_scale:!1,category:"people"},upside_down_face:{keywords:["face","flipped","silly","smile"],"char":"\ud83d\ude43",fitzpatrick_scale:!1,category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],"char":"\u263a\ufe0f",fitzpatrick_scale:!1,category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"],"char":"\ud83d\ude0b",fitzpatrick_scale:!1,category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],"char":"\ud83d\ude0c",fitzpatrick_scale:!1,category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],"char":"\ud83d\ude0d",fitzpatrick_scale:!1,category:"people"},smiling_face_with_three_hearts:{keywords:["face","love","like","affection","valentines","infatuation","crush","hearts","adore"],"char":"\ud83e\udd70",fitzpatrick_scale:!1,category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],"char":"\ud83d\ude18",fitzpatrick_scale:!1,category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],"char":"\ud83d\ude17",fitzpatrick_scale:!1,category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],"char":"\ud83d\ude19",fitzpatrick_scale:!1,category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],"char":"\ud83d\ude1a",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],"char":"\ud83d\ude1c",fitzpatrick_scale:!1,category:"people"},zany:{keywords:["face","goofy","crazy"],"char":"\ud83e\udd2a",fitzpatrick_scale:!1,category:"people"},raised_eyebrow:{keywords:["face","distrust","scepticism","disapproval","disbelief","surprise"],"char":"\ud83e\udd28",fitzpatrick_scale:!1,category:"people"},monocle:{keywords:["face","stuffy","wealthy"],"char":"\ud83e\uddd0",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],"char":"\ud83d\ude1d",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],"char":"\ud83d\ude1b",fitzpatrick_scale:!1,category:"people"},money_mouth_face:{keywords:["face","rich","dollar","money"],"char":"\ud83e\udd11",fitzpatrick_scale:!1,category:"people"},nerd_face:{keywords:["face","nerdy","geek","dork"],"char":"\ud83e\udd13",fitzpatrick_scale:!1,category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],"char":"\ud83d\ude0e",fitzpatrick_scale:!1,category:"people"},star_struck:{keywords:["face","smile","starry","eyes","grinning"],"char":"\ud83e\udd29",fitzpatrick_scale:!1,category:"people"},clown_face:{keywords:["face"],"char":"\ud83e\udd21",fitzpatrick_scale:!1,category:"people"},cowboy_hat_face:{keywords:["face","cowgirl","hat"],"char":"\ud83e\udd20",fitzpatrick_scale:!1,category:"people"},hugs:{keywords:["face","smile","hug"],"char":"\ud83e\udd17",fitzpatrick_scale:!1,category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],"char":"\ud83d\ude0f",fitzpatrick_scale:!1,category:"people"},no_mouth:{keywords:["face","hellokitty"],"char":"\ud83d\ude36",fitzpatrick_scale:!1,category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],"char":"\ud83d\ude10",fitzpatrick_scale:!1,category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],"char":"\ud83d\ude11",fitzpatrick_scale:!1,category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"],"char":"\ud83d\ude12",fitzpatrick_scale:!1,category:"people"},roll_eyes:{keywords:["face","eyeroll","frustrated"],"char":"\ud83d\ude44",fitzpatrick_scale:!1,category:"people"},thinking:{keywords:["face","hmmm","think","consider"],"char":"\ud83e\udd14",fitzpatrick_scale:!1,category:"people"},lying_face:{keywords:["face","lie","pinocchio"],"char":"\ud83e\udd25",fitzpatrick_scale:!1,category:"people"},hand_over_mouth:{keywords:["face","whoops","shock","surprise"],"char":"\ud83e\udd2d",fitzpatrick_scale:!1,category:"people"},shushing:{keywords:["face","quiet","shhh"],"char":"\ud83e\udd2b",fitzpatrick_scale:!1,category:"people"},symbols_over_mouth:{keywords:["face","swearing","cursing","cussing","profanity","expletive"],"char":"\ud83e\udd2c",fitzpatrick_scale:!1,category:"people"},exploding_head:{keywords:["face","shocked","mind","blown"],"char":"\ud83e\udd2f",fitzpatrick_scale:!1,category:"people"},flushed:{keywords:["face","blush","shy","flattered"],"char":"\ud83d\ude33",fitzpatrick_scale:!1,category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],"char":"\ud83d\ude1e",fitzpatrick_scale:!1,category:"people"},worried:{keywords:["face","concern","nervous",":("],"char":"\ud83d\ude1f",fitzpatrick_scale:!1,category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],"char":"\ud83d\ude20",fitzpatrick_scale:!1,category:"people"},rage:{keywords:["angry","mad","hate","despise"],"char":"\ud83d\ude21",fitzpatrick_scale:!1,category:"people"},pensive:{keywords:["face","sad","depressed","upset"],"char":"\ud83d\ude14",fitzpatrick_scale:!1,category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],"char":"\ud83d\ude15",fitzpatrick_scale:!1,category:"people"},slightly_frowning_face:{keywords:["face","frowning","disappointed","sad","upset"],"char":"\ud83d\ude41",fitzpatrick_scale:!1,category:"people"},frowning_face:{keywords:["face","sad","upset","frown"],"char":"\u2639",fitzpatrick_scale:!1,category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],"char":"\ud83d\ude23",fitzpatrick_scale:!1,category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],"char":"\ud83d\ude16",fitzpatrick_scale:!1,category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],"char":"\ud83d\ude2b",fitzpatrick_scale:!1,category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],"char":"\ud83d\ude29",fitzpatrick_scale:!1,category:"people"},pleading:{keywords:["face","begging","mercy"],"char":"\ud83e\udd7a",fitzpatrick_scale:!1,category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],"char":"\ud83d\ude24",fitzpatrick_scale:!1,category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],"char":"\ud83d\ude2e",fitzpatrick_scale:!1,category:"people"},scream:{keywords:["face","munch","scared","omg"],"char":"\ud83d\ude31",fitzpatrick_scale:!1,category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],"char":"\ud83d\ude28",fitzpatrick_scale:!1,category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],"char":"\ud83d\ude30",fitzpatrick_scale:!1,category:"people"},hushed:{keywords:["face","woo","shh"],"char":"\ud83d\ude2f",fitzpatrick_scale:!1,category:"people"},frowning:{keywords:["face","aw","what"],"char":"\ud83d\ude26",fitzpatrick_scale:!1,category:"people"},anguished:{keywords:["face","stunned","nervous"],"char":"\ud83d\ude27",fitzpatrick_scale:!1,category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],"char":"\ud83d\ude22",fitzpatrick_scale:!1,category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],"char":"\ud83d\ude25",fitzpatrick_scale:!1,category:"people"},drooling_face:{keywords:["face"],"char":"\ud83e\udd24",fitzpatrick_scale:!1,category:"people"},sleepy:{keywords:["face","tired","rest","nap"],"char":"\ud83d\ude2a",fitzpatrick_scale:!1,category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],"char":"\ud83d\ude13",fitzpatrick_scale:!1,category:"people"},hot:{keywords:["face","feverish","heat","red","sweating"],"char":"\ud83e\udd75",fitzpatrick_scale:!1,category:"people"},cold:{keywords:["face","blue","freezing","frozen","frostbite","icicles"],"char":"\ud83e\udd76",fitzpatrick_scale:!1,category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],"char":"\ud83d\ude2d",fitzpatrick_scale:!1,category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],"char":"\ud83d\ude35",fitzpatrick_scale:!1,category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],"char":"\ud83d\ude32",fitzpatrick_scale:!1,category:"people"},zipper_mouth_face:{keywords:["face","sealed","zipper","secret"],"char":"\ud83e\udd10",fitzpatrick_scale:!1,category:"people"},nauseated_face:{keywords:["face","vomit","gross","green","sick","throw up","ill"],"char":"\ud83e\udd22",fitzpatrick_scale:!1,category:"people"},sneezing_face:{keywords:["face","gesundheit","sneeze","sick","allergy"],"char":"\ud83e\udd27",fitzpatrick_scale:!1,category:"people"},vomiting:{keywords:["face","sick"],"char":"\ud83e\udd2e",fitzpatrick_scale:!1,category:"people"},mask:{keywords:["face","sick","ill","disease"],"char":"\ud83d\ude37",fitzpatrick_scale:!1,category:"people"},face_with_thermometer:{keywords:["sick","temperature","thermometer","cold","fever"],"char":"\ud83e\udd12",fitzpatrick_scale:!1,category:"people"},face_with_head_bandage:{keywords:["injured","clumsy","bandage","hurt"],"char":"\ud83e\udd15",fitzpatrick_scale:!1,category:"people"},woozy:{keywords:["face","dizzy","intoxicated","tipsy","wavy"],"char":"\ud83e\udd74",fitzpatrick_scale:!1,category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],"char":"\ud83d\ude34",fitzpatrick_scale:!1,category:"people"},zzz:{keywords:["sleepy","tired","dream"],"char":"\ud83d\udca4",fitzpatrick_scale:!1,category:"people"},poop:{keywords:["hankey","shitface","fail","turd","shit"],"char":"\ud83d\udca9",fitzpatrick_scale:!1,category:"people"},smiling_imp:{keywords:["devil","horns"],"char":"\ud83d\ude08",fitzpatrick_scale:!1,category:"people"},imp:{keywords:["devil","angry","horns"],"char":"\ud83d\udc7f",fitzpatrick_scale:!1,category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],"char":"\ud83d\udc79",fitzpatrick_scale:!1,category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],"char":"\ud83d\udc7a",fitzpatrick_scale:!1,category:"people"},skull:{keywords:["dead","skeleton","creepy","death"],"char":"\ud83d\udc80",fitzpatrick_scale:!1,category:"people"},ghost:{keywords:["halloween","spooky","scary"],"char":"\ud83d\udc7b",fitzpatrick_scale:!1,category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],"char":"\ud83d\udc7d",fitzpatrick_scale:!1,category:"people"},robot:{keywords:["computer","machine","bot"],"char":"\ud83e\udd16",fitzpatrick_scale:!1,category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],"char":"\ud83d\ude3a",fitzpatrick_scale:!1,category:"people"},smile_cat:{keywords:["animal","cats","smile"],"char":"\ud83d\ude38",fitzpatrick_scale:!1,category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],"char":"\ud83d\ude39",fitzpatrick_scale:!1,category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],"char":"\ud83d\ude3b",fitzpatrick_scale:!1,category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],"char":"\ud83d\ude3c",fitzpatrick_scale:!1,category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],"char":"\ud83d\ude3d",fitzpatrick_scale:!1,category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],"char":"\ud83d\ude40",fitzpatrick_scale:!1,category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],"char":"\ud83d\ude3f",fitzpatrick_scale:!1,category:"people"},pouting_cat:{keywords:["animal","cats"],"char":"\ud83d\ude3e",fitzpatrick_scale:!1,category:"people"},palms_up:{keywords:["hands","gesture","cupped","prayer"],"char":"\ud83e\udd32",fitzpatrick_scale:!0,category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],"char":"\ud83d\ude4c",fitzpatrick_scale:!0,category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],"char":"\ud83d\udc4f",fitzpatrick_scale:!0,category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","hi","palm"],"char":"\ud83d\udc4b",fitzpatrick_scale:!0,category:"people"},call_me_hand:{keywords:["hands","gesture"],"char":"\ud83e\udd19",fitzpatrick_scale:!0,category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],"char":"\ud83d\udc4d",fitzpatrick_scale:!0,category:"people"},"-1":{keywords:["thumbsdown","no","dislike","hand"],"char":"\ud83d\udc4e",fitzpatrick_scale:!0,category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],"char":"\ud83d\udc4a",fitzpatrick_scale:!0,category:"people"},fist:{keywords:["fingers","hand","grasp"],"char":"\u270a",fitzpatrick_scale:!0,category:"people"},fist_left:{keywords:["hand","fistbump"],"char":"\ud83e\udd1b",fitzpatrick_scale:!0,category:"people"},fist_right:{keywords:["hand","fistbump"],"char":"\ud83e\udd1c",fitzpatrick_scale:!0,category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],"char":"\u270c",fitzpatrick_scale:!0,category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok","okay"],"char":"\ud83d\udc4c",fitzpatrick_scale:!0,category:"people"},raised_hand:{keywords:["fingers","stop","highfive","palm","ban"],"char":"\u270b",fitzpatrick_scale:!0,category:"people"},raised_back_of_hand:{keywords:["fingers","raised","backhand"],"char":"\ud83e\udd1a",fitzpatrick_scale:!0,category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],"char":"\ud83d\udc50",fitzpatrick_scale:!0,category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],"char":"\ud83d\udcaa",fitzpatrick_scale:!0,category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],"char":"\ud83d\ude4f",fitzpatrick_scale:!0,category:"people"},foot:{keywords:["kick","stomp"],"char":"\ud83e\uddb6",fitzpatrick_scale:!0,category:"people"},leg:{keywords:["kick","limb"],"char":"\ud83e\uddb5",fitzpatrick_scale:!0,category:"people"},handshake:{keywords:["agreement","shake"],"char":"\ud83e\udd1d",fitzpatrick_scale:!1,category:"people"},point_up:{keywords:["hand","fingers","direction","up"],"char":"\u261d",fitzpatrick_scale:!0,category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],"char":"\ud83d\udc46",fitzpatrick_scale:!0,category:"people"},point_down:{keywords:["fingers","hand","direction","down"],"char":"\ud83d\udc47",fitzpatrick_scale:!0,category:"people"},point_left:{keywords:["direction","fingers","hand","left"],"char":"\ud83d\udc48",fitzpatrick_scale:!0,category:"people"},point_right:{keywords:["fingers","hand","direction","right"],"char":"\ud83d\udc49",fitzpatrick_scale:!0,category:"people"},fu:{keywords:["hand","fingers","rude","middle","flipping"],"char":"\ud83d\udd95",fitzpatrick_scale:!0,category:"people"},raised_hand_with_fingers_splayed:{keywords:["hand","fingers","palm"],"char":"\ud83d\udd90",fitzpatrick_scale:!0,category:"people"},love_you:{keywords:["hand","fingers","gesture"],"char":"\ud83e\udd1f",fitzpatrick_scale:!0,category:"people"},metal:{keywords:["hand","fingers","evil_eye","sign_of_horns","rock_on"],"char":"\ud83e\udd18",fitzpatrick_scale:!0,category:"people"},crossed_fingers:{keywords:["good","lucky"],"char":"\ud83e\udd1e",fitzpatrick_scale:!0,category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],"char":"\ud83d\udd96",fitzpatrick_scale:!0,category:"people"},writing_hand:{keywords:["lower_left_ballpoint_pen","stationery","write","compose"],"char":"\u270d",fitzpatrick_scale:!0,category:"people"},selfie:{keywords:["camera","phone"],"char":"\ud83e\udd33",fitzpatrick_scale:!0,category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],"char":"\ud83d\udc85",fitzpatrick_scale:!0,category:"people"},lips:{keywords:["mouth","kiss"],"char":"\ud83d\udc44",fitzpatrick_scale:!1,category:"people"},tooth:{keywords:["teeth","dentist"],"char":"\ud83e\uddb7",fitzpatrick_scale:!1,category:"people"},tongue:{keywords:["mouth","playful"],"char":"\ud83d\udc45",fitzpatrick_scale:!1,category:"people"},ear:{keywords:["face","hear","sound","listen"],"char":"\ud83d\udc42",fitzpatrick_scale:!0,category:"people"},nose:{keywords:["smell","sniff"],"char":"\ud83d\udc43",fitzpatrick_scale:!0,category:"people"},eye:{keywords:["face","look","see","watch","stare"],"char":"\ud83d\udc41",fitzpatrick_scale:!1,category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],"char":"\ud83d\udc40",fitzpatrick_scale:!1,category:"people"},brain:{keywords:["smart","intelligent"],"char":"\ud83e\udde0",fitzpatrick_scale:!1,category:"people"},bust_in_silhouette:{keywords:["user","person","human"],"char":"\ud83d\udc64",fitzpatrick_scale:!1,category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],"char":"\ud83d\udc65",fitzpatrick_scale:!1,category:"people"},speaking_head:{keywords:["user","person","human","sing","say","talk"],"char":"\ud83d\udde3",fitzpatrick_scale:!1,category:"people"},baby:{keywords:["child","boy","girl","toddler"],"char":"\ud83d\udc76",fitzpatrick_scale:!0,category:"people"},child:{keywords:["gender-neutral","young"],"char":"\ud83e\uddd2",fitzpatrick_scale:!0,category:"people"},boy:{keywords:["man","male","guy","teenager"],"char":"\ud83d\udc66",fitzpatrick_scale:!0,category:"people"},girl:{keywords:["female","woman","teenager"],"char":"\ud83d\udc67",fitzpatrick_scale:!0,category:"people"},adult:{keywords:["gender-neutral","person"],"char":"\ud83e\uddd1",fitzpatrick_scale:!0,category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],"char":"\ud83d\udc68",fitzpatrick_scale:!0,category:"people"},woman:{keywords:["female","girls","lady"],"char":"\ud83d\udc69",fitzpatrick_scale:!0,category:"people"},blonde_woman:{keywords:["woman","female","girl","blonde","person"],"char":"\ud83d\udc71\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},blonde_man:{keywords:["man","male","boy","blonde","guy","person"],"char":"\ud83d\udc71",fitzpatrick_scale:!0,category:"people"},bearded_person:{keywords:["person","bewhiskered"],"char":"\ud83e\uddd4",fitzpatrick_scale:!0,category:"people"},older_adult:{keywords:["human","elder","senior","gender-neutral"],"char":"\ud83e\uddd3",fitzpatrick_scale:!0,category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],"char":"\ud83d\udc74",fitzpatrick_scale:!0,category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],"char":"\ud83d\udc75",fitzpatrick_scale:!0,category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],"char":"\ud83d\udc72",fitzpatrick_scale:!0,category:"people"},woman_with_headscarf:{keywords:["female","hijab","mantilla","tichel"],"char":"\ud83e\uddd5",fitzpatrick_scale:!0,category:"people"},woman_with_turban:{keywords:["female","indian","hinduism","arabs","woman"],"char":"\ud83d\udc73\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],"char":"\ud83d\udc73",fitzpatrick_scale:!0,category:"people"},policewoman:{keywords:["woman","police","law","legal","enforcement","arrest","911","female"],"char":"\ud83d\udc6e\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},policeman:{keywords:["man","police","law","legal","enforcement","arrest","911"],"char":"\ud83d\udc6e",fitzpatrick_scale:!0,category:"people"},construction_worker_woman:{keywords:["female","human","wip","build","construction","worker","labor","woman"],"char":"\ud83d\udc77\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},construction_worker_man:{keywords:["male","human","wip","guy","build","construction","worker","labor"],"char":"\ud83d\udc77",fitzpatrick_scale:!0,category:"people"},guardswoman:{keywords:["uk","gb","british","female","royal","woman"],"char":"\ud83d\udc82\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],"char":"\ud83d\udc82",fitzpatrick_scale:!0,category:"people"},female_detective:{keywords:["human","spy","detective","female","woman"],"char":"\ud83d\udd75\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},male_detective:{keywords:["human","spy","detective"],"char":"\ud83d\udd75",fitzpatrick_scale:!0,category:"people"},woman_health_worker:{keywords:["doctor","nurse","therapist","healthcare","woman","human"],"char":"\ud83d\udc69\u200d\u2695\ufe0f",fitzpatrick_scale:!0,category:"people"},man_health_worker:{keywords:["doctor","nurse","therapist","healthcare","man","human"],"char":"\ud83d\udc68\u200d\u2695\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_farmer:{keywords:["rancher","gardener","woman","human"],"char":"\ud83d\udc69\u200d\ud83c\udf3e",fitzpatrick_scale:!0,category:"people"},man_farmer:{keywords:["rancher","gardener","man","human"],"char":"\ud83d\udc68\u200d\ud83c\udf3e",fitzpatrick_scale:!0,category:"people"},woman_cook:{keywords:["chef","woman","human"],"char":"\ud83d\udc69\u200d\ud83c\udf73",fitzpatrick_scale:!0,category:"people"},man_cook:{keywords:["chef","man","human"],"char":"\ud83d\udc68\u200d\ud83c\udf73",fitzpatrick_scale:!0,category:"people"},woman_student:{keywords:["graduate","woman","human"],"char":"\ud83d\udc69\u200d\ud83c\udf93",fitzpatrick_scale:!0,category:"people"},man_student:{keywords:["graduate","man","human"],"char":"\ud83d\udc68\u200d\ud83c\udf93",fitzpatrick_scale:!0,category:"people"},woman_singer:{keywords:["rockstar","entertainer","woman","human"],"char":"\ud83d\udc69\u200d\ud83c\udfa4",fitzpatrick_scale:!0,category:"people"},man_singer:{keywords:["rockstar","entertainer","man","human"],"char":"\ud83d\udc68\u200d\ud83c\udfa4",fitzpatrick_scale:!0,category:"people"},woman_teacher:{keywords:["instructor","professor","woman","human"],"char":"\ud83d\udc69\u200d\ud83c\udfeb",fitzpatrick_scale:!0,category:"people"},man_teacher:{keywords:["instructor","professor","man","human"],"char":"\ud83d\udc68\u200d\ud83c\udfeb",fitzpatrick_scale:!0,category:"people"},woman_factory_worker:{keywords:["assembly","industrial","woman","human"],"char":"\ud83d\udc69\u200d\ud83c\udfed",fitzpatrick_scale:!0,category:"people"},man_factory_worker:{keywords:["assembly","industrial","man","human"],"char":"\ud83d\udc68\u200d\ud83c\udfed",fitzpatrick_scale:!0,category:"people"},woman_technologist:{keywords:["coder","developer","engineer","programmer","software","woman","human","laptop","computer"],"char":"\ud83d\udc69\u200d\ud83d\udcbb",fitzpatrick_scale:!0,category:"people"},man_technologist:{keywords:["coder","developer","engineer","programmer","software","man","human","laptop","computer"],"char":"\ud83d\udc68\u200d\ud83d\udcbb",fitzpatrick_scale:!0,category:"people"},woman_office_worker:{keywords:["business","manager","woman","human"],"char":"\ud83d\udc69\u200d\ud83d\udcbc",fitzpatrick_scale:!0,category:"people"},man_office_worker:{keywords:["business","manager","man","human"],"char":"\ud83d\udc68\u200d\ud83d\udcbc",fitzpatrick_scale:!0,category:"people"},woman_mechanic:{keywords:["plumber","woman","human","wrench"],"char":"\ud83d\udc69\u200d\ud83d\udd27",fitzpatrick_scale:!0,category:"people"},man_mechanic:{keywords:["plumber","man","human","wrench"],"char":"\ud83d\udc68\u200d\ud83d\udd27",fitzpatrick_scale:!0,category:"people"},woman_scientist:{keywords:["biologist","chemist","engineer","physicist","woman","human"],"char":"\ud83d\udc69\u200d\ud83d\udd2c",fitzpatrick_scale:!0,category:"people"},man_scientist:{keywords:["biologist","chemist","engineer","physicist","man","human"],"char":"\ud83d\udc68\u200d\ud83d\udd2c",fitzpatrick_scale:!0,category:"people"},woman_artist:{keywords:["painter","woman","human"],"char":"\ud83d\udc69\u200d\ud83c\udfa8",fitzpatrick_scale:!0,category:"people"},man_artist:{keywords:["painter","man","human"],"char":"\ud83d\udc68\u200d\ud83c\udfa8",fitzpatrick_scale:!0,category:"people"},woman_firefighter:{keywords:["fireman","woman","human"],"char":"\ud83d\udc69\u200d\ud83d\ude92",fitzpatrick_scale:!0,category:"people"},man_firefighter:{keywords:["fireman","man","human"],"char":"\ud83d\udc68\u200d\ud83d\ude92",fitzpatrick_scale:!0,category:"people"},woman_pilot:{keywords:["aviator","plane","woman","human"],"char":"\ud83d\udc69\u200d\u2708\ufe0f",fitzpatrick_scale:!0,category:"people"},man_pilot:{keywords:["aviator","plane","man","human"],"char":"\ud83d\udc68\u200d\u2708\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_astronaut:{keywords:["space","rocket","woman","human"],"char":"\ud83d\udc69\u200d\ud83d\ude80",fitzpatrick_scale:!0,category:"people"},man_astronaut:{keywords:["space","rocket","man","human"],"char":"\ud83d\udc68\u200d\ud83d\ude80",fitzpatrick_scale:!0,category:"people"},woman_judge:{keywords:["justice","court","woman","human"],"char":"\ud83d\udc69\u200d\u2696\ufe0f",fitzpatrick_scale:!0,category:"people"},man_judge:{keywords:["justice","court","man","human"],"char":"\ud83d\udc68\u200d\u2696\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_superhero:{keywords:["woman","female","good","heroine","superpowers"],"char":"\ud83e\uddb8\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_superhero:{keywords:["man","male","good","hero","superpowers"],"char":"\ud83e\uddb8\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_supervillain:{keywords:["woman","female","evil","bad","criminal","heroine","superpowers"],"char":"\ud83e\uddb9\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_supervillain:{keywords:["man","male","evil","bad","criminal","hero","superpowers"],"char":"\ud83e\uddb9\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},mrs_claus:{keywords:["woman","female","xmas","mother christmas"],"char":"\ud83e\udd36",fitzpatrick_scale:!0,category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],"char":"\ud83c\udf85",fitzpatrick_scale:!0,category:"people"},sorceress:{keywords:["woman","female","mage","witch"],"char":"\ud83e\uddd9\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},wizard:{keywords:["man","male","mage","sorcerer"],"char":"\ud83e\uddd9\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_elf:{keywords:["woman","female"],"char":"\ud83e\udddd\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_elf:{keywords:["man","male"],"char":"\ud83e\udddd\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_vampire:{keywords:["woman","female"],"char":"\ud83e\udddb\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_vampire:{keywords:["man","male","dracula"],"char":"\ud83e\udddb\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_zombie:{keywords:["woman","female","undead","walking dead"],"char":"\ud83e\udddf\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"people"},man_zombie:{keywords:["man","male","dracula","undead","walking dead"],"char":"\ud83e\udddf\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},woman_genie:{keywords:["woman","female"],"char":"\ud83e\uddde\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"people"},man_genie:{keywords:["man","male"],"char":"\ud83e\uddde\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},mermaid:{keywords:["woman","female","merwoman","ariel"],"char":"\ud83e\udddc\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},merman:{keywords:["man","male","triton"],"char":"\ud83e\udddc\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_fairy:{keywords:["woman","female"],"char":"\ud83e\uddda\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_fairy:{keywords:["man","male"],"char":"\ud83e\uddda\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},angel:{keywords:["heaven","wings","halo"],"char":"\ud83d\udc7c",fitzpatrick_scale:!0,category:"people"},pregnant_woman:{keywords:["baby"],"char":"\ud83e\udd30",fitzpatrick_scale:!0,category:"people"},breastfeeding:{keywords:["nursing","baby"],"char":"\ud83e\udd31",fitzpatrick_scale:!0,category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],"char":"\ud83d\udc78",fitzpatrick_scale:!0,category:"people"},prince:{keywords:["boy","man","male","crown","royal","king"],"char":"\ud83e\udd34",fitzpatrick_scale:!0,category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],"char":"\ud83d\udc70",fitzpatrick_scale:!0,category:"people"},man_in_tuxedo:{keywords:["couple","marriage","wedding","groom"],"char":"\ud83e\udd35",fitzpatrick_scale:!0,category:"people"},running_woman:{keywords:["woman","walking","exercise","race","running","female"],"char":"\ud83c\udfc3\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},running_man:{keywords:["man","walking","exercise","race","running"],"char":"\ud83c\udfc3",fitzpatrick_scale:!0,category:"people"},walking_woman:{keywords:["human","feet","steps","woman","female"],"char":"\ud83d\udeb6\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},walking_man:{keywords:["human","feet","steps"],"char":"\ud83d\udeb6",fitzpatrick_scale:!0,category:"people"},dancer:{keywords:["female","girl","woman","fun"],"char":"\ud83d\udc83",fitzpatrick_scale:!0,category:"people"},man_dancing:{keywords:["male","boy","fun","dancer"],"char":"\ud83d\udd7a",fitzpatrick_scale:!0,category:"people"},dancing_women:{keywords:["female","bunny","women","girls"],"char":"\ud83d\udc6f",fitzpatrick_scale:!1,category:"people"},dancing_men:{keywords:["male","bunny","men","boys"],"char":"\ud83d\udc6f\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],"char":"\ud83d\udc6b",fitzpatrick_scale:!1,category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],"char":"\ud83d\udc6c",fitzpatrick_scale:!1,category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],"char":"\ud83d\udc6d",fitzpatrick_scale:!1,category:"people"},bowing_woman:{keywords:["woman","female","girl"],"char":"\ud83d\ude47\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},bowing_man:{keywords:["man","male","boy"],"char":"\ud83d\ude47",fitzpatrick_scale:!0,category:"people"},man_facepalming:{keywords:["man","male","boy","disbelief"],"char":"\ud83e\udd26\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_facepalming:{keywords:["woman","female","girl","disbelief"],"char":"\ud83e\udd26\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_shrugging:{keywords:["woman","female","girl","confused","indifferent","doubt"],"char":"\ud83e\udd37",fitzpatrick_scale:!0,category:"people"},man_shrugging:{keywords:["man","male","boy","confused","indifferent","doubt"],"char":"\ud83e\udd37\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},tipping_hand_woman:{keywords:["female","girl","woman","human","information"],"char":"\ud83d\udc81",fitzpatrick_scale:!0,category:"people"},tipping_hand_man:{keywords:["male","boy","man","human","information"],"char":"\ud83d\udc81\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},no_good_woman:{keywords:["female","girl","woman","nope"],"char":"\ud83d\ude45",fitzpatrick_scale:!0,category:"people"},no_good_man:{keywords:["male","boy","man","nope"],"char":"\ud83d\ude45\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],"char":"\ud83d\ude46",fitzpatrick_scale:!0,category:"people"},ok_man:{keywords:["men","boy","male","blue","human","man"],"char":"\ud83d\ude46\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},raising_hand_woman:{keywords:["female","girl","woman"],"char":"\ud83d\ude4b",fitzpatrick_scale:!0,category:"people"},raising_hand_man:{keywords:["male","boy","man"],"char":"\ud83d\ude4b\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},pouting_woman:{keywords:["female","girl","woman"],"char":"\ud83d\ude4e",fitzpatrick_scale:!0,category:"people"},pouting_man:{keywords:["male","boy","man"],"char":"\ud83d\ude4e\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},frowning_woman:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],"char":"\ud83d\ude4d",fitzpatrick_scale:!0,category:"people"},frowning_man:{keywords:["male","boy","man","sad","depressed","discouraged","unhappy"],"char":"\ud83d\ude4d\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},haircut_woman:{keywords:["female","girl","woman"],"char":"\ud83d\udc87",fitzpatrick_scale:!0,category:"people"},haircut_man:{keywords:["male","boy","man"],"char":"\ud83d\udc87\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},massage_woman:{keywords:["female","girl","woman","head"],"char":"\ud83d\udc86",fitzpatrick_scale:!0,category:"people"},massage_man:{keywords:["male","boy","man","head"],"char":"\ud83d\udc86\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_in_steamy_room:{keywords:["female","woman","spa","steamroom","sauna"],"char":"\ud83e\uddd6\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_in_steamy_room:{keywords:["male","man","spa","steamroom","sauna"],"char":"\ud83e\uddd6\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},couple_with_heart_woman_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],"char":"\ud83d\udc91",fitzpatrick_scale:!1,category:"people"},couple_with_heart_woman_woman:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],"char":"\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69",fitzpatrick_scale:!1,category:"people"},couple_with_heart_man_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],"char":"\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68",fitzpatrick_scale:!1,category:"people"},couplekiss_man_woman:{keywords:["pair","valentines","love","like","dating","marriage"],"char":"\ud83d\udc8f",fitzpatrick_scale:!1,category:"people"},couplekiss_woman_woman:{keywords:["pair","valentines","love","like","dating","marriage"],"char":"\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69",fitzpatrick_scale:!1,category:"people"},couplekiss_man_man:{keywords:["pair","valentines","love","like","dating","marriage"],"char":"\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68",fitzpatrick_scale:!1,category:"people"},family_man_woman_boy:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],"char":"\ud83d\udc6a",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],"char":"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_woman_boy_boy:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_girl:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_boy:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy_boy:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_girl:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_man_boy:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_man_girl:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_man_girl_boy:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_man_boy_boy:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_man_girl_girl:{keywords:["home","parents","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_boy:{keywords:["home","parent","people","human","child"],"char":"\ud83d\udc69\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_girl:{keywords:["home","parent","people","human","child"],"char":"\ud83d\udc69\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_girl_boy:{keywords:["home","parent","people","human","children"],"char":"\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_boy_boy:{keywords:["home","parent","people","human","children"],"char":"\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_girl_girl:{keywords:["home","parent","people","human","children"],"char":"\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_boy:{keywords:["home","parent","people","human","child"],"char":"\ud83d\udc68\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_girl:{keywords:["home","parent","people","human","child"],"char":"\ud83d\udc68\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_girl_boy:{keywords:["home","parent","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_boy_boy:{keywords:["home","parent","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_girl_girl:{keywords:["home","parent","people","human","children"],"char":"\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},yarn:{keywords:["ball","crochet","knit"],"char":"\ud83e\uddf6",fitzpatrick_scale:!1,category:"people"},thread:{keywords:["needle","sewing","spool","string"],"char":"\ud83e\uddf5",fitzpatrick_scale:!1,category:"people"},coat:{keywords:["jacket"],"char":"\ud83e\udde5",fitzpatrick_scale:!1,category:"people"},labcoat:{keywords:["doctor","experiment","scientist","chemist"],"char":"\ud83e\udd7c",fitzpatrick_scale:!1,category:"people"},womans_clothes:{keywords:["fashion","shopping_bags","female"],"char":"\ud83d\udc5a",fitzpatrick_scale:!1,category:"people"},tshirt:{keywords:["fashion","cloth","casual","shirt","tee"],"char":"\ud83d\udc55",fitzpatrick_scale:!1,category:"people"},jeans:{keywords:["fashion","shopping"],"char":"\ud83d\udc56",fitzpatrick_scale:!1,category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],"char":"\ud83d\udc54",fitzpatrick_scale:!1,category:"people"},dress:{keywords:["clothes","fashion","shopping"],"char":"\ud83d\udc57",fitzpatrick_scale:!1,category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],"char":"\ud83d\udc59",fitzpatrick_scale:!1,category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],"char":"\ud83d\udc58",fitzpatrick_scale:!1,category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],"char":"\ud83d\udc84",fitzpatrick_scale:!1,category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],"char":"\ud83d\udc8b",fitzpatrick_scale:!1,category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],"char":"\ud83d\udc63",fitzpatrick_scale:!1,category:"people"},flat_shoe:{keywords:["ballet","slip-on","slipper"],"char":"\ud83e\udd7f",fitzpatrick_scale:!1,category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],"char":"\ud83d\udc60",fitzpatrick_scale:!1,category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],"char":"\ud83d\udc61",fitzpatrick_scale:!1,category:"people"},boot:{keywords:["shoes","fashion"],"char":"\ud83d\udc62",fitzpatrick_scale:!1,category:"people"},mans_shoe:{keywords:["fashion","male"],"char":"\ud83d\udc5e",fitzpatrick_scale:!1,category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],"char":"\ud83d\udc5f",fitzpatrick_scale:!1,category:"people"},hiking_boot:{keywords:["backpacking","camping","hiking"],"char":"\ud83e\udd7e",fitzpatrick_scale:!1,category:"people"},socks:{keywords:["stockings","clothes"],"char":"\ud83e\udde6",fitzpatrick_scale:!1,category:"people"},gloves:{keywords:["hands","winter","clothes"],"char":"\ud83e\udde4",fitzpatrick_scale:!1,category:"people"},scarf:{keywords:["neck","winter","clothes"],"char":"\ud83e\udde3",fitzpatrick_scale:!1,category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],"char":"\ud83d\udc52",fitzpatrick_scale:!1,category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],"char":"\ud83c\udfa9",fitzpatrick_scale:!1,category:"people"},billed_hat:{keywords:["cap","baseball"],"char":"\ud83e\udde2",fitzpatrick_scale:!1,category:"people"},rescue_worker_helmet:{keywords:["construction","build"],"char":"\u26d1",fitzpatrick_scale:!1,category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],"char":"\ud83c\udf93",fitzpatrick_scale:!1,category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],"char":"\ud83d\udc51",fitzpatrick_scale:!1,category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],"char":"\ud83c\udf92",fitzpatrick_scale:!1,category:"people"},luggage:{keywords:["packing","travel"],"char":"\ud83e\uddf3",fitzpatrick_scale:!1,category:"people"},pouch:{keywords:["bag","accessories","shopping"],"char":"\ud83d\udc5d",fitzpatrick_scale:!1,category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],"char":"\ud83d\udc5b",fitzpatrick_scale:!1,category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],"char":"\ud83d\udc5c",fitzpatrick_scale:!1,category:"people"},briefcase:{keywords:["business","documents","work","law","legal","job","career"],"char":"\ud83d\udcbc",fitzpatrick_scale:!1,category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],"char":"\ud83d\udc53",fitzpatrick_scale:!1,category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],"char":"\ud83d\udd76",fitzpatrick_scale:!1,category:"people"},goggles:{keywords:["eyes","protection","safety"],"char":"\ud83e\udd7d",fitzpatrick_scale:!1,category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],"char":"\ud83d\udc8d",fitzpatrick_scale:!1,category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],"char":"\ud83c\udf02",fitzpatrick_scale:!1,category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],"char":"\ud83d\udc36",fitzpatrick_scale:!1,category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],"char":"\ud83d\udc31",fitzpatrick_scale:!1,category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese_wedge","rodent"],"char":"\ud83d\udc2d",fitzpatrick_scale:!1,category:"animals_and_nature"},hamster:{keywords:["animal","nature"],"char":"\ud83d\udc39",fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],"char":"\ud83d\udc30",fitzpatrick_scale:!1,category:"animals_and_nature"},fox_face:{keywords:["animal","nature","face"],"char":"\ud83e\udd8a",fitzpatrick_scale:!1,category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],"char":"\ud83d\udc3b",fitzpatrick_scale:!1,category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],"char":"\ud83d\udc3c",fitzpatrick_scale:!1,category:"animals_and_nature"},koala:{keywords:["animal","nature"],"char":"\ud83d\udc28",fitzpatrick_scale:!1,category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],"char":"\ud83d\udc2f",fitzpatrick_scale:!1,category:"animals_and_nature"},lion:{keywords:["animal","nature"],"char":"\ud83e\udd81",fitzpatrick_scale:!1,category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],"char":"\ud83d\udc2e",fitzpatrick_scale:!1,category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],"char":"\ud83d\udc37",fitzpatrick_scale:!1,category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],"char":"\ud83d\udc3d",fitzpatrick_scale:!1,category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],"char":"\ud83d\udc38",fitzpatrick_scale:!1,category:"animals_and_nature"},squid:{keywords:["animal","nature","ocean","sea"],"char":"\ud83e\udd91",fitzpatrick_scale:!1,category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],"char":"\ud83d\udc19",fitzpatrick_scale:!1,category:"animals_and_nature"},shrimp:{keywords:["animal","ocean","nature","seafood"],"char":"\ud83e\udd90",fitzpatrick_scale:!1,category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],"char":"\ud83d\udc35",fitzpatrick_scale:!1,category:"animals_and_nature"},gorilla:{keywords:["animal","nature","circus"],"char":"\ud83e\udd8d",fitzpatrick_scale:!1,category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],"char":"\ud83d\ude48",fitzpatrick_scale:!1,category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],"char":"\ud83d\ude49",fitzpatrick_scale:!1,category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],"char":"\ud83d\ude4a",fitzpatrick_scale:!1,category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],"char":"\ud83d\udc12",fitzpatrick_scale:!1,category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],"char":"\ud83d\udc14",fitzpatrick_scale:!1,category:"animals_and_nature"},penguin:{keywords:["animal","nature"],"char":"\ud83d\udc27",fitzpatrick_scale:!1,category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],"char":"\ud83d\udc26",fitzpatrick_scale:!1,category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],"char":"\ud83d\udc24",fitzpatrick_scale:!1,category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],"char":"\ud83d\udc23",fitzpatrick_scale:!1,category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],"char":"\ud83d\udc25",fitzpatrick_scale:!1,category:"animals_and_nature"},duck:{keywords:["animal","nature","bird","mallard"],"char":"\ud83e\udd86",fitzpatrick_scale:!1,category:"animals_and_nature"},eagle:{keywords:["animal","nature","bird"],"char":"\ud83e\udd85",fitzpatrick_scale:!1,category:"animals_and_nature"},owl:{keywords:["animal","nature","bird","hoot"],"char":"\ud83e\udd89",fitzpatrick_scale:!1,category:"animals_and_nature"},bat:{keywords:["animal","nature","blind","vampire"],"char":"\ud83e\udd87",fitzpatrick_scale:!1,category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],"char":"\ud83d\udc3a",fitzpatrick_scale:!1,category:"animals_and_nature"},boar:{keywords:["animal","nature"],"char":"\ud83d\udc17",fitzpatrick_scale:!1,category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],"char":"\ud83d\udc34",fitzpatrick_scale:!1,category:"animals_and_nature"},unicorn:{keywords:["animal","nature","mystical"],"char":"\ud83e\udd84",fitzpatrick_scale:!1,category:"animals_and_nature"},honeybee:{keywords:["animal","insect","nature","bug","spring","honey"],"char":"\ud83d\udc1d",fitzpatrick_scale:!1,category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],"char":"\ud83d\udc1b",fitzpatrick_scale:!1,category:"animals_and_nature"},butterfly:{keywords:["animal","insect","nature","caterpillar"],"char":"\ud83e\udd8b",fitzpatrick_scale:!1,category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],"char":"\ud83d\udc0c",fitzpatrick_scale:!1,category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],"char":"\ud83d\udc1e",fitzpatrick_scale:!1,category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],"char":"\ud83d\udc1c",fitzpatrick_scale:!1,category:"animals_and_nature"},grasshopper:{keywords:["animal","cricket","chirp"],"char":"\ud83e\udd97",fitzpatrick_scale:!1,category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],"char":"\ud83d\udd77",fitzpatrick_scale:!1,category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],"char":"\ud83e\udd82",fitzpatrick_scale:!1,category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],"char":"\ud83e\udd80",fitzpatrick_scale:!1,category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],"char":"\ud83d\udc0d",fitzpatrick_scale:!1,category:"animals_and_nature"},lizard:{keywords:["animal","nature","reptile"],"char":"\ud83e\udd8e",fitzpatrick_scale:!1,category:"animals_and_nature"},"t-rex":{keywords:["animal","nature","dinosaur","tyrannosaurus","extinct"],"char":"\ud83e\udd96",fitzpatrick_scale:!1,category:"animals_and_nature"},sauropod:{keywords:["animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],"char":"\ud83e\udd95",fitzpatrick_scale:!1,category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],"char":"\ud83d\udc22",fitzpatrick_scale:!1,category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],"char":"\ud83d\udc20",fitzpatrick_scale:!1,category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],"char":"\ud83d\udc1f",fitzpatrick_scale:!1,category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],"char":"\ud83d\udc21",fitzpatrick_scale:!1,category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],"char":"\ud83d\udc2c",fitzpatrick_scale:!1,category:"animals_and_nature"},shark:{keywords:["animal","nature","fish","sea","ocean","jaws","fins","beach"],"char":"\ud83e\udd88",fitzpatrick_scale:!1,category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],"char":"\ud83d\udc33",fitzpatrick_scale:!1,category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],"char":"\ud83d\udc0b",fitzpatrick_scale:!1,category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],"char":"\ud83d\udc0a",fitzpatrick_scale:!1,category:"animals_and_nature"},leopard:{keywords:["animal","nature"],"char":"\ud83d\udc06",fitzpatrick_scale:!1,category:"animals_and_nature"},zebra:{keywords:["animal","nature","stripes","safari"],"char":"\ud83e\udd93",fitzpatrick_scale:!1,category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],"char":"\ud83d\udc05",fitzpatrick_scale:!1,category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],"char":"\ud83d\udc03",fitzpatrick_scale:!1,category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],"char":"\ud83d\udc02",fitzpatrick_scale:!1,category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],"char":"\ud83d\udc04",fitzpatrick_scale:!1,category:"animals_and_nature"},deer:{keywords:["animal","nature","horns","venison"],"char":"\ud83e\udd8c",fitzpatrick_scale:!1,category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],"char":"\ud83d\udc2a",fitzpatrick_scale:!1,category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],"char":"\ud83d\udc2b",fitzpatrick_scale:!1,category:"animals_and_nature"},giraffe:{keywords:["animal","nature","spots","safari"],"char":"\ud83e\udd92",fitzpatrick_scale:!1,category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","th","circus"],"char":"\ud83d\udc18",fitzpatrick_scale:!1,category:"animals_and_nature"},rhinoceros:{keywords:["animal","nature","horn"],"char":"\ud83e\udd8f",fitzpatrick_scale:!1,category:"animals_and_nature"},goat:{keywords:["animal","nature"],"char":"\ud83d\udc10",fitzpatrick_scale:!1,category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],"char":"\ud83d\udc0f",fitzpatrick_scale:!1,category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],"char":"\ud83d\udc11",fitzpatrick_scale:!1,category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],"char":"\ud83d\udc0e",fitzpatrick_scale:!1,category:"animals_and_nature"},pig2:{keywords:["animal","nature"],"char":"\ud83d\udc16",fitzpatrick_scale:!1,category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],"char":"\ud83d\udc00",fitzpatrick_scale:!1,category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],"char":"\ud83d\udc01",fitzpatrick_scale:!1,category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],"char":"\ud83d\udc13",fitzpatrick_scale:!1,category:"animals_and_nature"},turkey:{keywords:["animal","bird"],"char":"\ud83e\udd83",fitzpatrick_scale:!1,category:"animals_and_nature"},dove:{keywords:["animal","bird"],"char":"\ud83d\udd4a",fitzpatrick_scale:!1,category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],"char":"\ud83d\udc15",fitzpatrick_scale:!1,category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],"char":"\ud83d\udc29",fitzpatrick_scale:!1,category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],"char":"\ud83d\udc08",fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],"char":"\ud83d\udc07",fitzpatrick_scale:!1,category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],"char":"\ud83d\udc3f",fitzpatrick_scale:!1,category:"animals_and_nature"},hedgehog:{keywords:["animal","nature","spiny"],"char":"\ud83e\udd94",fitzpatrick_scale:!1,category:"animals_and_nature"},raccoon:{keywords:["animal","nature"],"char":"\ud83e\udd9d",fitzpatrick_scale:!1,category:"animals_and_nature"},llama:{keywords:["animal","nature","alpaca"],"char":"\ud83e\udd99",fitzpatrick_scale:!1,category:"animals_and_nature"},hippopotamus:{keywords:["animal","nature"],"char":"\ud83e\udd9b",fitzpatrick_scale:!1,category:"animals_and_nature"},kangaroo:{keywords:["animal","nature","australia","joey","hop","marsupial"],"char":"\ud83e\udd98",fitzpatrick_scale:!1,category:"animals_and_nature"},badger:{keywords:["animal","nature","honey"],"char":"\ud83e\udda1",fitzpatrick_scale:!1,category:"animals_and_nature"},swan:{keywords:["animal","nature","bird"],"char":"\ud83e\udda2",fitzpatrick_scale:!1,category:"animals_and_nature"},peacock:{keywords:["animal","nature","peahen","bird"],"char":"\ud83e\udd9a",fitzpatrick_scale:!1,category:"animals_and_nature"},parrot:{keywords:["animal","nature","bird","pirate","talk"],"char":"\ud83e\udd9c",fitzpatrick_scale:!1,category:"animals_and_nature"},lobster:{keywords:["animal","nature","bisque","claws","seafood"],"char":"\ud83e\udd9e",fitzpatrick_scale:!1,category:"animals_and_nature"},mosquito:{keywords:["animal","nature","insect","malaria"],"char":"\ud83e\udd9f",fitzpatrick_scale:!1,category:"animals_and_nature"},paw_prints:{keywords:["animal","tracking","footprints","dog","cat","pet","feet"],"char":"\ud83d\udc3e",fitzpatrick_scale:!1,category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],"char":"\ud83d\udc09",fitzpatrick_scale:!1,category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],"char":"\ud83d\udc32",fitzpatrick_scale:!1,category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],"char":"\ud83c\udf35",fitzpatrick_scale:!1,category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],"char":"\ud83c\udf84",fitzpatrick_scale:!1,category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],"char":"\ud83c\udf32",fitzpatrick_scale:!1,category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],"char":"\ud83c\udf33",fitzpatrick_scale:!1,category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],"char":"\ud83c\udf34",fitzpatrick_scale:!1,category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],"char":"\ud83c\udf31",fitzpatrick_scale:!1,category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],"char":"\ud83c\udf3f",fitzpatrick_scale:!1,category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],"char":"\u2618",fitzpatrick_scale:!1,category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],"char":"\ud83c\udf40",fitzpatrick_scale:!1,category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],"char":"\ud83c\udf8d",fitzpatrick_scale:!1,category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],"char":"\ud83c\udf8b",fitzpatrick_scale:!1,category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],"char":"\ud83c\udf43",fitzpatrick_scale:!1,category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],"char":"\ud83c\udf42",fitzpatrick_scale:!1,category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","ca","fall"],"char":"\ud83c\udf41",fitzpatrick_scale:!1,category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],"char":"\ud83c\udf3e",fitzpatrick_scale:!1,category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],"char":"\ud83c\udf3a",fitzpatrick_scale:!1,category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],"char":"\ud83c\udf3b",fitzpatrick_scale:!1,category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],"char":"\ud83c\udf39",fitzpatrick_scale:!1,category:"animals_and_nature"},wilted_flower:{keywords:["plant","nature","flower"],"char":"\ud83e\udd40",fitzpatrick_scale:!1,category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],"char":"\ud83c\udf37",fitzpatrick_scale:!1,category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],"char":"\ud83c\udf3c",fitzpatrick_scale:!1,category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],"char":"\ud83c\udf38",fitzpatrick_scale:!1,category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],"char":"\ud83d\udc90",fitzpatrick_scale:!1,category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],"char":"\ud83c\udf44",fitzpatrick_scale:!1,category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],"char":"\ud83c\udf30",fitzpatrick_scale:!1,category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],"char":"\ud83c\udf83",fitzpatrick_scale:!1,category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],"char":"\ud83d\udc1a",fitzpatrick_scale:!1,category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],"char":"\ud83d\udd78",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],"char":"\ud83c\udf0e",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],"char":"\ud83c\udf0d",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],"char":"\ud83c\udf0f",fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],"char":"\ud83c\udf15",fitzpatrick_scale:!1,category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],"char":"\ud83c\udf16",fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":"\ud83c\udf17",fitzpatrick_scale:!1,category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":"\ud83c\udf18",fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":"\ud83c\udf11",fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":"\ud83c\udf12",fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":"\ud83c\udf13",fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_gibbous_moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],"char":"\ud83c\udf14",fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":"\ud83c\udf1a",fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":"\ud83c\udf1d",fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":"\ud83c\udf1b",fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],"char":"\ud83c\udf1c",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],"char":"\ud83c\udf1e",fitzpatrick_scale:!1,category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],"char":"\ud83c\udf19",fitzpatrick_scale:!1,category:"animals_and_nature"},star:{keywords:["night","yellow"],"char":"\u2b50",fitzpatrick_scale:!1,category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],"char":"\ud83c\udf1f",fitzpatrick_scale:!1,category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],"char":"\ud83d\udcab",fitzpatrick_scale:!1,category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],"char":"\u2728",fitzpatrick_scale:!1,category:"animals_and_nature"},comet:{keywords:["space"],"char":"\u2604",fitzpatrick_scale:!1,category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],"char":"\u2600\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_small_cloud:{keywords:["weather"],"char":"\ud83c\udf24",fitzpatrick_scale:!1,category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],"char":"\u26c5",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_large_cloud:{keywords:["weather"],"char":"\ud83c\udf25",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_rain_cloud:{keywords:["weather"],"char":"\ud83c\udf26",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud:{keywords:["weather","sky"],"char":"\u2601\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],"char":"\ud83c\udf27",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning_and_rain:{keywords:["weather","lightning"],"char":"\u26c8",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],"char":"\ud83c\udf29",fitzpatrick_scale:!1,category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],"char":"\u26a1",fitzpatrick_scale:!1,category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],"char":"\ud83d\udd25",fitzpatrick_scale:!1,category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],"char":"\ud83d\udca5",fitzpatrick_scale:!1,category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],"char":"\u2744\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],"char":"\ud83c\udf28",fitzpatrick_scale:!1,category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],"char":"\u26c4",fitzpatrick_scale:!1,category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],"char":"\u2603",fitzpatrick_scale:!1,category:"animals_and_nature"},wind_face:{keywords:["gust","air"],"char":"\ud83c\udf2c",fitzpatrick_scale:!1,category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],"char":"\ud83d\udca8",fitzpatrick_scale:!1,category:"animals_and_nature"},tornado:{keywords:["weather","cyclone","twister"],"char":"\ud83c\udf2a",fitzpatrick_scale:!1,category:"animals_and_nature"},fog:{keywords:["weather"],"char":"\ud83c\udf2b",fitzpatrick_scale:!1,category:"animals_and_nature"},open_umbrella:{keywords:["weather","spring"],"char":"\u2602",fitzpatrick_scale:!1,category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],"char":"\u2614",fitzpatrick_scale:!1,category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],"char":"\ud83d\udca7",fitzpatrick_scale:!1,category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],"char":"\ud83d\udca6",fitzpatrick_scale:!1,category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],"char":"\ud83c\udf0a",fitzpatrick_scale:!1,category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],"char":"\ud83c\udf4f",fitzpatrick_scale:!1,category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],"char":"\ud83c\udf4e",fitzpatrick_scale:!1,category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],"char":"\ud83c\udf50",fitzpatrick_scale:!1,category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],"char":"\ud83c\udf4a",fitzpatrick_scale:!1,category:"food_and_drink"},lemon:{keywords:["fruit","nature"],"char":"\ud83c\udf4b",fitzpatrick_scale:!1,category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],"char":"\ud83c\udf4c",fitzpatrick_scale:!1,category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],"char":"\ud83c\udf49",fitzpatrick_scale:!1,category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],"char":"\ud83c\udf47",fitzpatrick_scale:!1,category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],"char":"\ud83c\udf53",fitzpatrick_scale:!1,category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],"char":"\ud83c\udf48",fitzpatrick_scale:!1,category:"food_and_drink"},cherries:{keywords:["food","fruit"],"char":"\ud83c\udf52",fitzpatrick_scale:!1,category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],"char":"\ud83c\udf51",fitzpatrick_scale:!1,category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],"char":"\ud83c\udf4d",fitzpatrick_scale:!1,category:"food_and_drink"},coconut:{keywords:["fruit","nature","food","palm"],"char":"\ud83e\udd65",fitzpatrick_scale:!1,category:"food_and_drink"},kiwi_fruit:{keywords:["fruit","food"],"char":"\ud83e\udd5d",fitzpatrick_scale:!1,category:"food_and_drink"},mango:{keywords:["fruit","food","tropical"],"char":"\ud83e\udd6d",fitzpatrick_scale:!1,category:"food_and_drink"},avocado:{keywords:["fruit","food"],"char":"\ud83e\udd51",fitzpatrick_scale:!1,category:"food_and_drink"},broccoli:{keywords:["fruit","food","vegetable"],"char":"\ud83e\udd66",fitzpatrick_scale:!1,category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],"char":"\ud83c\udf45",fitzpatrick_scale:!1,category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],"char":"\ud83c\udf46",fitzpatrick_scale:!1,category:"food_and_drink"},cucumber:{keywords:["fruit","food","pickle"],"char":"\ud83e\udd52",fitzpatrick_scale:!1,category:"food_and_drink"},carrot:{keywords:["vegetable","food","orange"],"char":"\ud83e\udd55",fitzpatrick_scale:!1,category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],"char":"\ud83c\udf36",fitzpatrick_scale:!1,category:"food_and_drink"},potato:{keywords:["food","tuber","vegatable","starch"],"char":"\ud83e\udd54",fitzpatrick_scale:!1,category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],"char":"\ud83c\udf3d",fitzpatrick_scale:!1,category:"food_and_drink"},leafy_greens:{keywords:["food","vegetable","plant","bok choy","cabbage","kale","lettuce"],"char":"\ud83e\udd6c",fitzpatrick_scale:!1,category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],"char":"\ud83c\udf60",fitzpatrick_scale:!1,category:"food_and_drink"},peanuts:{keywords:["food","nut"],"char":"\ud83e\udd5c",fitzpatrick_scale:!1,category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],"char":"\ud83c\udf6f",fitzpatrick_scale:!1,category:"food_and_drink"},croissant:{keywords:["food","bread","french"],"char":"\ud83e\udd50",fitzpatrick_scale:!1,category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],"char":"\ud83c\udf5e",fitzpatrick_scale:!1,category:"food_and_drink"},baguette_bread:{keywords:["food","bread","french"],"char":"\ud83e\udd56",fitzpatrick_scale:!1,category:"food_and_drink"},bagel:{keywords:["food","bread","bakery","schmear"],"char":"\ud83e\udd6f",fitzpatrick_scale:!1,category:"food_and_drink"},pretzel:{keywords:["food","bread","twisted"],"char":"\ud83e\udd68",fitzpatrick_scale:!1,category:"food_and_drink"},cheese:{keywords:["food","chadder"],"char":"\ud83e\uddc0",fitzpatrick_scale:!1,category:"food_and_drink"},egg:{keywords:["food","chicken","breakfast"],"char":"\ud83e\udd5a",fitzpatrick_scale:!1,category:"food_and_drink"},bacon:{keywords:["food","breakfast","pork","pig","meat"],"char":"\ud83e\udd53",fitzpatrick_scale:!1,category:"food_and_drink"},steak:{keywords:["food","cow","meat","cut","chop","lambchop","porkchop"],"char":"\ud83e\udd69",fitzpatrick_scale:!1,category:"food_and_drink"},pancakes:{keywords:["food","breakfast","flapjacks","hotcakes"],"char":"\ud83e\udd5e",fitzpatrick_scale:!1,category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],"char":"\ud83c\udf57",fitzpatrick_scale:!1,category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],"char":"\ud83c\udf56",fitzpatrick_scale:!1,category:"food_and_drink"},bone:{keywords:["skeleton"],"char":"\ud83e\uddb4",fitzpatrick_scale:!1,category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],"char":"\ud83c\udf64",fitzpatrick_scale:!1,category:"food_and_drink"},fried_egg:{keywords:["food","breakfast","kitchen","egg"],"char":"\ud83c\udf73",fitzpatrick_scale:!1,category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],"char":"\ud83c\udf54",fitzpatrick_scale:!1,category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],"char":"\ud83c\udf5f",fitzpatrick_scale:!1,category:"food_and_drink"},stuffed_flatbread:{keywords:["food","flatbread","stuffed","gyro"],"char":"\ud83e\udd59",fitzpatrick_scale:!1,category:"food_and_drink"},hotdog:{keywords:["food","frankfurter"],"char":"\ud83c\udf2d",fitzpatrick_scale:!1,category:"food_and_drink"},pizza:{keywords:["food","party"],"char":"\ud83c\udf55",fitzpatrick_scale:!1,category:"food_and_drink"},sandwich:{keywords:["food","lunch","bread"],"char":"\ud83e\udd6a",fitzpatrick_scale:!1,category:"food_and_drink"},canned_food:{keywords:["food","soup"],"char":"\ud83e\udd6b",fitzpatrick_scale:!1,category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],"char":"\ud83c\udf5d",fitzpatrick_scale:!1,category:"food_and_drink"},taco:{keywords:["food","mexican"],"char":"\ud83c\udf2e",fitzpatrick_scale:!1,category:"food_and_drink"},burrito:{keywords:["food","mexican"],"char":"\ud83c\udf2f",fitzpatrick_scale:!1,category:"food_and_drink"},green_salad:{keywords:["food","healthy","lettuce"],"char":"\ud83e\udd57",fitzpatrick_scale:!1,category:"food_and_drink"},shallow_pan_of_food:{keywords:["food","cooking","casserole","paella"],"char":"\ud83e\udd58",fitzpatrick_scale:!1,category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],"char":"\ud83c\udf5c",fitzpatrick_scale:!1,category:"food_and_drink"},stew:{keywords:["food","meat","soup"],"char":"\ud83c\udf72",fitzpatrick_scale:!1,category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"],"char":"\ud83c\udf65",fitzpatrick_scale:!1,category:"food_and_drink"},fortune_cookie:{keywords:["food","prophecy"],"char":"\ud83e\udd60",fitzpatrick_scale:!1,category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],"char":"\ud83c\udf63",fitzpatrick_scale:!1,category:"food_and_drink"},bento:{keywords:["food","japanese","box"],"char":"\ud83c\udf71",fitzpatrick_scale:!1,category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],"char":"\ud83c\udf5b",fitzpatrick_scale:!1,category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],"char":"\ud83c\udf59",fitzpatrick_scale:!1,category:"food_and_drink"},rice:{keywords:["food","china","asian"],"char":"\ud83c\udf5a",fitzpatrick_scale:!1,category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],"char":"\ud83c\udf58",fitzpatrick_scale:!1,category:"food_and_drink"},oden:{keywords:["food","japanese"],"char":"\ud83c\udf62",fitzpatrick_scale:!1,category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],"char":"\ud83c\udf61",fitzpatrick_scale:!1,category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],"char":"\ud83c\udf67",fitzpatrick_scale:!1,category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],"char":"\ud83c\udf68",fitzpatrick_scale:!1,category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],"char":"\ud83c\udf66",fitzpatrick_scale:!1,category:"food_and_drink"},pie:{keywords:["food","dessert","pastry"],"char":"\ud83e\udd67",fitzpatrick_scale:!1,category:"food_and_drink"},cake:{keywords:["food","dessert"],"char":"\ud83c\udf70",fitzpatrick_scale:!1,category:"food_and_drink"},cupcake:{keywords:["food","dessert","bakery","sweet"],"char":"\ud83e\uddc1",fitzpatrick_scale:!1,category:"food_and_drink"},moon_cake:{keywords:["food","autumn"],"char":"\ud83e\udd6e",fitzpatrick_scale:!1,category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],"char":"\ud83c\udf82",fitzpatrick_scale:!1,category:"food_and_drink"},custard:{keywords:["dessert","food"],"char":"\ud83c\udf6e",fitzpatrick_scale:!1,category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],"char":"\ud83c\udf6c",fitzpatrick_scale:!1,category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],"char":"\ud83c\udf6d",fitzpatrick_scale:!1,category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],"char":"\ud83c\udf6b",fitzpatrick_scale:!1,category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],"char":"\ud83c\udf7f",fitzpatrick_scale:!1,category:"food_and_drink"},dumpling:{keywords:["food","empanada","pierogi","potsticker"],"char":"\ud83e\udd5f",fitzpatrick_scale:!1,category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],"char":"\ud83c\udf69",fitzpatrick_scale:!1,category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],"char":"\ud83c\udf6a",fitzpatrick_scale:!1,category:"food_and_drink"},milk_glass:{keywords:["beverage","drink","cow"],"char":"\ud83e\udd5b",fitzpatrick_scale:!1,category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],"char":"\ud83c\udf7a",fitzpatrick_scale:!1,category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],"char":"\ud83c\udf7b",fitzpatrick_scale:!1,category:"food_and_drink"},clinking_glasses:{keywords:["beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],"char":"\ud83e\udd42",fitzpatrick_scale:!1,category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],"char":"\ud83c\udf77",fitzpatrick_scale:!1,category:"food_and_drink"},tumbler_glass:{keywords:["drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],"char":"\ud83e\udd43",fitzpatrick_scale:!1,category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],"char":"\ud83c\udf78",fitzpatrick_scale:!1,category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],"char":"\ud83c\udf79",fitzpatrick_scale:!1,category:"food_and_drink"},champagne:{keywords:["drink","wine","bottle","celebration"],"char":"\ud83c\udf7e",fitzpatrick_scale:!1,category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],"char":"\ud83c\udf76",fitzpatrick_scale:!1,category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],"char":"\ud83c\udf75",fitzpatrick_scale:!1,category:"food_and_drink"},cup_with_straw:{keywords:["drink","soda"],"char":"\ud83e\udd64",fitzpatrick_scale:!1,category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],"char":"\u2615",fitzpatrick_scale:!1,category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],"char":"\ud83c\udf7c",fitzpatrick_scale:!1,category:"food_and_drink"},salt:{keywords:["condiment","shaker"],"char":"\ud83e\uddc2",fitzpatrick_scale:!1,category:"food_and_drink"},spoon:{keywords:["cutlery","kitchen","tableware"],"char":"\ud83e\udd44",fitzpatrick_scale:!1,category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],"char":"\ud83c\udf74",fitzpatrick_scale:!1,category:"food_and_drink"},plate_with_cutlery:{keywords:["food","eat","meal","lunch","dinner","restaurant"],"char":"\ud83c\udf7d",fitzpatrick_scale:!1,category:"food_and_drink"},bowl_with_spoon:{keywords:["food","breakfast","cereal","oatmeal","porridge"],"char":"\ud83e\udd63",fitzpatrick_scale:!1,category:"food_and_drink"},takeout_box:{keywords:["food","leftovers"],"char":"\ud83e\udd61",fitzpatrick_scale:!1,category:"food_and_drink"},chopsticks:{keywords:["food"],"char":"\ud83e\udd62",fitzpatrick_scale:!1,category:"food_and_drink"},soccer:{keywords:["sports","football"],"char":"\u26bd",fitzpatrick_scale:!1,category:"activity"},basketball:{keywords:["sports","balls","NBA"],"char":"\ud83c\udfc0",fitzpatrick_scale:!1,category:"activity"},football:{keywords:["sports","balls","NFL"],"char":"\ud83c\udfc8",fitzpatrick_scale:!1,category:"activity"},baseball:{keywords:["sports","balls"],"char":"\u26be",fitzpatrick_scale:!1,category:"activity"},softball:{keywords:["sports","balls"],"char":"\ud83e\udd4e",fitzpatrick_scale:!1,category:"activity"},tennis:{keywords:["sports","balls","green"],"char":"\ud83c\udfbe",fitzpatrick_scale:!1,category:"activity"},volleyball:{keywords:["sports","balls"],"char":"\ud83c\udfd0",fitzpatrick_scale:!1,category:"activity"},rugby_football:{keywords:["sports","team"],"char":"\ud83c\udfc9",fitzpatrick_scale:!1,category:"activity"},flying_disc:{keywords:["sports","frisbee","ultimate"],"char":"\ud83e\udd4f",fitzpatrick_scale:!1,category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],"char":"\ud83c\udfb1",fitzpatrick_scale:!1,category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],"char":"\u26f3",fitzpatrick_scale:!1,category:"activity"},golfing_woman:{keywords:["sports","business","woman","female"],"char":"\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"activity"},golfing_man:{keywords:["sports","business"],"char":"\ud83c\udfcc",fitzpatrick_scale:!0,category:"activity"},ping_pong:{keywords:["sports","pingpong"],"char":"\ud83c\udfd3",fitzpatrick_scale:!1,category:"activity"},badminton:{keywords:["sports"],"char":"\ud83c\udff8",fitzpatrick_scale:!1,category:"activity"},goal_net:{keywords:["sports"],"char":"\ud83e\udd45",fitzpatrick_scale:!1,category:"activity"},ice_hockey:{keywords:["sports"],"char":"\ud83c\udfd2",fitzpatrick_scale:!1,category:"activity"},field_hockey:{keywords:["sports"],"char":"\ud83c\udfd1",fitzpatrick_scale:!1,category:"activity"},lacrosse:{keywords:["sports","ball","stick"],"char":"\ud83e\udd4d",fitzpatrick_scale:!1,category:"activity"},cricket:{keywords:["sports"],"char":"\ud83c\udfcf",fitzpatrick_scale:!1,category:"activity"},ski:{keywords:["sports","winter","cold","snow"],"char":"\ud83c\udfbf",fitzpatrick_scale:!1,category:"activity"},skier:{keywords:["sports","winter","snow"],"char":"\u26f7",fitzpatrick_scale:!1,category:"activity"},snowboarder:{keywords:["sports","winter"],"char":"\ud83c\udfc2",fitzpatrick_scale:!0,category:"activity"},person_fencing:{keywords:["sports","fencing","sword"],"char":"\ud83e\udd3a",fitzpatrick_scale:!1,category:"activity"},women_wrestling:{keywords:["sports","wrestlers"],"char":"\ud83e\udd3c\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"activity"},men_wrestling:{keywords:["sports","wrestlers"],"char":"\ud83e\udd3c\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"activity"},woman_cartwheeling:{keywords:["gymnastics"],"char":"\ud83e\udd38\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_cartwheeling:{keywords:["gymnastics"],"char":"\ud83e\udd38\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},woman_playing_handball:{keywords:["sports"],"char":"\ud83e\udd3e\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_playing_handball:{keywords:["sports"],"char":"\ud83e\udd3e\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},ice_skate:{keywords:["sports"],"char":"\u26f8",fitzpatrick_scale:!1,category:"activity"},curling_stone:{keywords:["sports"],"char":"\ud83e\udd4c",fitzpatrick_scale:!1,category:"activity"},skateboard:{keywords:["board"],"char":"\ud83d\udef9",fitzpatrick_scale:!1,category:"activity"},sled:{keywords:["sleigh","luge","toboggan"],"char":"\ud83d\udef7",fitzpatrick_scale:!1,category:"activity"},bow_and_arrow:{keywords:["sports"],"char":"\ud83c\udff9",fitzpatrick_scale:!1,category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],"char":"\ud83c\udfa3",fitzpatrick_scale:!1,category:"activity"},boxing_glove:{keywords:["sports","fighting"],"char":"\ud83e\udd4a",fitzpatrick_scale:!1,category:"activity"},martial_arts_uniform:{keywords:["judo","karate","taekwondo"],"char":"\ud83e\udd4b",fitzpatrick_scale:!1,category:"activity"},rowing_woman:{keywords:["sports","hobby","water","ship","woman","female"],"char":"\ud83d\udea3\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},rowing_man:{keywords:["sports","hobby","water","ship"],"char":"\ud83d\udea3",fitzpatrick_scale:!0,category:"activity"},climbing_woman:{keywords:["sports","hobby","woman","female","rock"],"char":"\ud83e\uddd7\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},climbing_man:{keywords:["sports","hobby","man","male","rock"],"char":"\ud83e\uddd7\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},swimming_woman:{keywords:["sports","exercise","human","athlete","water","summer","woman","female"],"char":"\ud83c\udfca\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},swimming_man:{keywords:["sports","exercise","human","athlete","water","summer"],"char":"\ud83c\udfca",fitzpatrick_scale:!0,category:"activity"},woman_playing_water_polo:{keywords:["sports","pool"],"char":"\ud83e\udd3d\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_playing_water_polo:{keywords:["sports","pool"],"char":"\ud83e\udd3d\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},woman_in_lotus_position:{keywords:["woman","female","meditation","yoga","serenity","zen","mindfulness"],"char":"\ud83e\uddd8\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_in_lotus_position:{keywords:["man","male","meditation","yoga","serenity","zen","mindfulness"],"char":"\ud83e\uddd8\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},surfing_woman:{keywords:["sports","ocean","sea","summer","beach","woman","female"],"char":"\ud83c\udfc4\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},surfing_man:{keywords:["sports","ocean","sea","summer","beach"],"char":"\ud83c\udfc4",fitzpatrick_scale:!0,category:"activity"},bath:{keywords:["clean","shower","bathroom"],"char":"\ud83d\udec0",fitzpatrick_scale:!0,category:"activity"},basketball_woman:{keywords:["sports","human","woman","female"],"char":"\u26f9\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},basketball_man:{keywords:["sports","human"],"char":"\u26f9",fitzpatrick_scale:!0,category:"activity"},weight_lifting_woman:{keywords:["sports","training","exercise","woman","female"],"char":"\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},weight_lifting_man:{keywords:["sports","training","exercise"],"char":"\ud83c\udfcb",fitzpatrick_scale:!0,category:"activity"},biking_woman:{keywords:["sports","bike","exercise","hipster","woman","female"],"char":"\ud83d\udeb4\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},biking_man:{keywords:["sports","bike","exercise","hipster"],"char":"\ud83d\udeb4",fitzpatrick_scale:!0,category:"activity"},mountain_biking_woman:{keywords:["transportation","sports","human","race","bike","woman","female"],"char":"\ud83d\udeb5\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},mountain_biking_man:{keywords:["transportation","sports","human","race","bike"],"char":"\ud83d\udeb5",fitzpatrick_scale:!0,category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],"char":"\ud83c\udfc7",fitzpatrick_scale:!0,category:"activity"},business_suit_levitating:{keywords:["suit","business","levitate","hover","jump"],"char":"\ud83d\udd74",fitzpatrick_scale:!0,category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],"char":"\ud83c\udfc6",fitzpatrick_scale:!1,category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],"char":"\ud83c\udfbd",fitzpatrick_scale:!1,category:"activity"},medal_sports:{keywords:["award","winning"],"char":"\ud83c\udfc5",fitzpatrick_scale:!1,category:"activity"},medal_military:{keywords:["award","winning","army"],"char":"\ud83c\udf96",fitzpatrick_scale:!1,category:"activity"},"1st_place_medal":{keywords:["award","winning","first"],"char":"\ud83e\udd47",fitzpatrick_scale:!1,category:"activity"},"2nd_place_medal":{keywords:["award","second"],"char":"\ud83e\udd48",fitzpatrick_scale:!1,category:"activity"},"3rd_place_medal":{keywords:["award","third"],"char":"\ud83e\udd49",fitzpatrick_scale:!1,category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],"char":"\ud83c\udf97",fitzpatrick_scale:!1,category:"activity"},rosette:{keywords:["flower","decoration","military"],"char":"\ud83c\udff5",fitzpatrick_scale:!1,category:"activity"},ticket:{keywords:["event","concert","pass"],"char":"\ud83c\udfab",fitzpatrick_scale:!1,category:"activity"},tickets:{keywords:["sports","concert","entrance"],"char":"\ud83c\udf9f",fitzpatrick_scale:!1,category:"activity"},performing_arts:{keywords:["acting","theater","drama"],"char":"\ud83c\udfad",fitzpatrick_scale:!1,category:"activity"},art:{keywords:["design","paint","draw","colors"],"char":"\ud83c\udfa8",fitzpatrick_scale:!1,category:"activity"},circus_tent:{keywords:["festival","carnival","party"],"char":"\ud83c\udfaa",fitzpatrick_scale:!1,category:"activity"},woman_juggling:{keywords:["juggle","balance","skill","multitask"],"char":"\ud83e\udd39\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_juggling:{keywords:["juggle","balance","skill","multitask"],"char":"\ud83e\udd39\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},microphone:{keywords:["sound","music","PA","sing","talkshow"],"char":"\ud83c\udfa4",fitzpatrick_scale:!1,category:"activity"},headphones:{keywords:["music","score","gadgets"],"char":"\ud83c\udfa7",fitzpatrick_scale:!1,category:"activity"},musical_score:{keywords:["treble","clef","compose"],"char":"\ud83c\udfbc",fitzpatrick_scale:!1,category:"activity"},musical_keyboard:{keywords:["piano","instrument","compose"],"char":"\ud83c\udfb9",fitzpatrick_scale:!1,category:"activity"},drum:{keywords:["music","instrument","drumsticks","snare"],"char":"\ud83e\udd41",fitzpatrick_scale:!1,category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],"char":"\ud83c\udfb7",fitzpatrick_scale:!1,category:"activity"},trumpet:{keywords:["music","brass"],"char":"\ud83c\udfba",fitzpatrick_scale:!1,category:"activity"},guitar:{keywords:["music","instrument"],"char":"\ud83c\udfb8",fitzpatrick_scale:!1,category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],"char":"\ud83c\udfbb",fitzpatrick_scale:!1,category:"activity"},clapper:{keywords:["movie","film","record"],"char":"\ud83c\udfac",fitzpatrick_scale:!1,category:"activity"},video_game:{keywords:["play","console","PS4","controller"],"char":"\ud83c\udfae",fitzpatrick_scale:!1,category:"activity"},space_invader:{keywords:["game","arcade","play"],"char":"\ud83d\udc7e",fitzpatrick_scale:!1,category:"activity"},dart:{keywords:["game","play","bar","target","bullseye"],"char":"\ud83c\udfaf",fitzpatrick_scale:!1,category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],"char":"\ud83c\udfb2",fitzpatrick_scale:!1,category:"activity"},chess_pawn:{keywords:["expendable"],"char":"\u265f",fitzpatrick_scale:!1,category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],"char":"\ud83c\udfb0",fitzpatrick_scale:!1,category:"activity"},jigsaw:{keywords:["interlocking","puzzle","piece"],"char":"\ud83e\udde9",fitzpatrick_scale:!1,category:"activity"},bowling:{keywords:["sports","fun","play"],"char":"\ud83c\udfb3",fitzpatrick_scale:!1,category:"activity"},red_car:{keywords:["red","transportation","vehicle"],"char":"\ud83d\ude97",fitzpatrick_scale:!1,category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],"char":"\ud83d\ude95",fitzpatrick_scale:!1,category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],"char":"\ud83d\ude99",fitzpatrick_scale:!1,category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],"char":"\ud83d\ude8c",fitzpatrick_scale:!1,category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],"char":"\ud83d\ude8e",fitzpatrick_scale:!1,category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],"char":"\ud83c\udfce",fitzpatrick_scale:!1,category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],"char":"\ud83d\ude93",fitzpatrick_scale:!1,category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],"char":"\ud83d\ude91",fitzpatrick_scale:!1,category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],"char":"\ud83d\ude92",fitzpatrick_scale:!1,category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],"char":"\ud83d\ude90",fitzpatrick_scale:!1,category:"travel_and_places"},truck:{keywords:["cars","transportation"],"char":"\ud83d\ude9a",fitzpatrick_scale:!1,category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],"char":"\ud83d\ude9b",fitzpatrick_scale:!1,category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],"char":"\ud83d\ude9c",fitzpatrick_scale:!1,category:"travel_and_places"},kick_scooter:{keywords:["vehicle","kick","razor"],"char":"\ud83d\udef4",fitzpatrick_scale:!1,category:"travel_and_places"},motorcycle:{keywords:["race","sports","fast"],"char":"\ud83c\udfcd",fitzpatrick_scale:!1,category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],"char":"\ud83d\udeb2",fitzpatrick_scale:!1,category:"travel_and_places"},motor_scooter:{keywords:["vehicle","vespa","sasha"],"char":"\ud83d\udef5",fitzpatrick_scale:!1,category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],"char":"\ud83d\udea8",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],"char":"\ud83d\ude94",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],"char":"\ud83d\ude8d",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],"char":"\ud83d\ude98",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],"char":"\ud83d\ude96",fitzpatrick_scale:!1,category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],"char":"\ud83d\udea1",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],"char":"\ud83d\udea0",fitzpatrick_scale:!1,category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],"char":"\ud83d\ude9f",fitzpatrick_scale:!1,category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],"char":"\ud83d\ude83",fitzpatrick_scale:!1,category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],"char":"\ud83d\ude8b",fitzpatrick_scale:!1,category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],"char":"\ud83d\ude9d",fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],"char":"\ud83d\ude84",fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],"char":"\ud83d\ude85",fitzpatrick_scale:!1,category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],"char":"\ud83d\ude88",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],"char":"\ud83d\ude9e",fitzpatrick_scale:!1,category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],"char":"\ud83d\ude82",fitzpatrick_scale:!1,category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],"char":"\ud83d\ude86",fitzpatrick_scale:!1,category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],"char":"\ud83d\ude87",fitzpatrick_scale:!1,category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],"char":"\ud83d\ude8a",fitzpatrick_scale:!1,category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],"char":"\ud83d\ude89",fitzpatrick_scale:!1,category:"travel_and_places"},flying_saucer:{keywords:["transportation","vehicle","ufo"],"char":"\ud83d\udef8",fitzpatrick_scale:!1,category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],"char":"\ud83d\ude81",fitzpatrick_scale:!1,category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],"char":"\ud83d\udee9",fitzpatrick_scale:!1,category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],"char":"\u2708\ufe0f",fitzpatrick_scale:!1,category:"travel_and_places"},flight_departure:{keywords:["airport","flight","landing"],"char":"\ud83d\udeeb",fitzpatrick_scale:!1,category:"travel_and_places"},flight_arrival:{keywords:["airport","flight","boarding"],"char":"\ud83d\udeec",fitzpatrick_scale:!1,category:"travel_and_places"},sailboat:{keywords:["ship","summer","transportation","water","sailing"],"char":"\u26f5",fitzpatrick_scale:!1,category:"travel_and_places"},motor_boat:{keywords:["ship"],"char":"\ud83d\udee5",fitzpatrick_scale:!1,category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],"char":"\ud83d\udea4",fitzpatrick_scale:!1,category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],"char":"\u26f4",fitzpatrick_scale:!1,category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],"char":"\ud83d\udef3",fitzpatrick_scale:!1,category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],"char":"\ud83d\ude80",fitzpatrick_scale:!1,category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],"char":"\ud83d\udef0",fitzpatrick_scale:!1,category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],"char":"\ud83d\udcba",fitzpatrick_scale:!1,category:"travel_and_places"},canoe:{keywords:["boat","paddle","water","ship"],"char":"\ud83d\udef6",fitzpatrick_scale:!1,category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],"char":"\u2693",fitzpatrick_scale:!1,category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],"char":"\ud83d\udea7",fitzpatrick_scale:!1,category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],"char":"\u26fd",fitzpatrick_scale:!1,category:"travel_and_places"},busstop:{keywords:["transportation","wait"],"char":"\ud83d\ude8f",fitzpatrick_scale:!1,category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],"char":"\ud83d\udea6",fitzpatrick_scale:!1,category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],"char":"\ud83d\udea5",fitzpatrick_scale:!1,category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],"char":"\ud83c\udfc1",fitzpatrick_scale:!1,category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],"char":"\ud83d\udea2",fitzpatrick_scale:!1,category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],"char":"\ud83c\udfa1",fitzpatrick_scale:!1,category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],"char":"\ud83c\udfa2",fitzpatrick_scale:!1,category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],"char":"\ud83c\udfa0",fitzpatrick_scale:!1,category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],"char":"\ud83c\udfd7",fitzpatrick_scale:!1,category:"travel_and_places"},foggy:{keywords:["photo","mountain"],"char":"\ud83c\udf01",fitzpatrick_scale:!1,category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],"char":"\ud83d\uddfc",fitzpatrick_scale:!1,category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],"char":"\ud83c\udfed",fitzpatrick_scale:!1,category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],"char":"\u26f2",fitzpatrick_scale:!1,category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],"char":"\ud83c\udf91",fitzpatrick_scale:!1,category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],"char":"\u26f0",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_snow:{keywords:["photo","nature","environment","winter","cold"],"char":"\ud83c\udfd4",fitzpatrick_scale:!1,category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],"char":"\ud83d\uddfb",fitzpatrick_scale:!1,category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],"char":"\ud83c\udf0b",fitzpatrick_scale:!1,category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],"char":"\ud83d\uddfe",fitzpatrick_scale:!1,category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],"char":"\ud83c\udfd5",fitzpatrick_scale:!1,category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],"char":"\u26fa",fitzpatrick_scale:!1,category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],"char":"\ud83c\udfde",fitzpatrick_scale:!1,category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],"char":"\ud83d\udee3",fitzpatrick_scale:!1,category:"travel_and_places"},railway_track:{keywords:["train","transportation"],"char":"\ud83d\udee4",fitzpatrick_scale:!1,category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],"char":"\ud83c\udf05",fitzpatrick_scale:!1,category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],"char":"\ud83c\udf04",fitzpatrick_scale:!1,category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],"char":"\ud83c\udfdc",fitzpatrick_scale:!1,category:"travel_and_places"},beach_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],"char":"\ud83c\udfd6",fitzpatrick_scale:!1,category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],"char":"\ud83c\udfdd",fitzpatrick_scale:!1,category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],"char":"\ud83c\udf07",fitzpatrick_scale:!1,category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],"char":"\ud83c\udf06",fitzpatrick_scale:!1,category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],"char":"\ud83c\udfd9",fitzpatrick_scale:!1,category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],"char":"\ud83c\udf03",fitzpatrick_scale:!1,category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],"char":"\ud83c\udf09",fitzpatrick_scale:!1,category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],"char":"\ud83c\udf0c",fitzpatrick_scale:!1,category:"travel_and_places"},stars:{keywords:["night","photo"],"char":"\ud83c\udf20",fitzpatrick_scale:!1,category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],"char":"\ud83c\udf87",fitzpatrick_scale:!1,category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],"char":"\ud83c\udf86",fitzpatrick_scale:!1,category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn_face","photo","sky","spring"],"char":"\ud83c\udf08",fitzpatrick_scale:!1,category:"travel_and_places"},houses:{keywords:["buildings","photo"],"char":"\ud83c\udfd8",fitzpatrick_scale:!1,category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],"char":"\ud83c\udff0",fitzpatrick_scale:!1,category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],"char":"\ud83c\udfef",fitzpatrick_scale:!1,category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],"char":"\ud83c\udfdf",fitzpatrick_scale:!1,category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],"char":"\ud83d\uddfd",fitzpatrick_scale:!1,category:"travel_and_places"},house:{keywords:["building","home"],"char":"\ud83c\udfe0",fitzpatrick_scale:!1,category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],"char":"\ud83c\udfe1",fitzpatrick_scale:!1,category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],"char":"\ud83c\udfda",fitzpatrick_scale:!1,category:"travel_and_places"},office:{keywords:["building","bureau","work"],"char":"\ud83c\udfe2",fitzpatrick_scale:!1,category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],"char":"\ud83c\udfec",fitzpatrick_scale:!1,category:"travel_and_places"},post_office:{keywords:["building","envelope","communication"],"char":"\ud83c\udfe3",fitzpatrick_scale:!1,category:"travel_and_places"},european_post_office:{keywords:["building","email"],"char":"\ud83c\udfe4",fitzpatrick_scale:!1,category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],"char":"\ud83c\udfe5",fitzpatrick_scale:!1,category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],"char":"\ud83c\udfe6",fitzpatrick_scale:!1,category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],"char":"\ud83c\udfe8",fitzpatrick_scale:!1,category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],"char":"\ud83c\udfea",fitzpatrick_scale:!1,category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],"char":"\ud83c\udfeb",fitzpatrick_scale:!1,category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],"char":"\ud83c\udfe9",fitzpatrick_scale:!1,category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],"char":"\ud83d\udc92",fitzpatrick_scale:!1,category:"travel_and_places"},classical_building:{keywords:["art","culture","history"],"char":"\ud83c\udfdb",fitzpatrick_scale:!1,category:"travel_and_places"},church:{keywords:["building","religion","christ"],"char":"\u26ea",fitzpatrick_scale:!1,category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],"char":"\ud83d\udd4c",fitzpatrick_scale:!1,category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],"char":"\ud83d\udd4d",fitzpatrick_scale:!1,category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],"char":"\ud83d\udd4b",fitzpatrick_scale:!1,category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],"char":"\u26e9",fitzpatrick_scale:!1,category:"travel_and_places"},watch:{keywords:["time","accessories"],"char":"\u231a",fitzpatrick_scale:!1,category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],"char":"\ud83d\udcf1",fitzpatrick_scale:!1,category:"objects"},calling:{keywords:["iphone","incoming"],"char":"\ud83d\udcf2",fitzpatrick_scale:!1,category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],"char":"\ud83d\udcbb",fitzpatrick_scale:!1,category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],"char":"\u2328",fitzpatrick_scale:!1,category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],"char":"\ud83d\udda5",fitzpatrick_scale:!1,category:"objects"},printer:{keywords:["paper","ink"],"char":"\ud83d\udda8",fitzpatrick_scale:!1,category:"objects"},computer_mouse:{keywords:["click"],"char":"\ud83d\uddb1",fitzpatrick_scale:!1,category:"objects"},trackball:{keywords:["technology","trackpad"],"char":"\ud83d\uddb2",fitzpatrick_scale:!1,category:"objects"},joystick:{keywords:["game","play"],"char":"\ud83d\udd79",fitzpatrick_scale:!1,category:"objects"},clamp:{keywords:["tool"],"char":"\ud83d\udddc",fitzpatrick_scale:!1,category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],"char":"\ud83d\udcbd",fitzpatrick_scale:!1,category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],"char":"\ud83d\udcbe",fitzpatrick_scale:!1,category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],"char":"\ud83d\udcbf",fitzpatrick_scale:!1,category:"objects"},dvd:{keywords:["cd","disk","disc"],"char":"\ud83d\udcc0",fitzpatrick_scale:!1,category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],"char":"\ud83d\udcfc",fitzpatrick_scale:!1,category:"objects"},camera:{keywords:["gadgets","photography"],"char":"\ud83d\udcf7",fitzpatrick_scale:!1,category:"objects"},camera_flash:{keywords:["photography","gadgets"],"char":"\ud83d\udcf8",fitzpatrick_scale:!1,category:"objects"},video_camera:{keywords:["film","record"],"char":"\ud83d\udcf9",fitzpatrick_scale:!1,category:"objects"},movie_camera:{keywords:["film","record"],"char":"\ud83c\udfa5",fitzpatrick_scale:!1,category:"objects"},film_projector:{keywords:["video","tape","record","movie"],"char":"\ud83d\udcfd",fitzpatrick_scale:!1,category:"objects"},film_strip:{keywords:["movie"],"char":"\ud83c\udf9e",fitzpatrick_scale:!1,category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],"char":"\ud83d\udcde",fitzpatrick_scale:!1,category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],"char":"\u260e\ufe0f",fitzpatrick_scale:!1,category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],"char":"\ud83d\udcdf",fitzpatrick_scale:!1,category:"objects"},fax:{keywords:["communication","technology"],"char":"\ud83d\udce0",fitzpatrick_scale:!1,category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],"char":"\ud83d\udcfa",fitzpatrick_scale:!1,category:"objects"},radio:{keywords:["communication","music","podcast","program"],"char":"\ud83d\udcfb",fitzpatrick_scale:!1,category:"objects"},studio_microphone:{keywords:["sing","recording","artist","talkshow"],"char":"\ud83c\udf99",fitzpatrick_scale:!1,category:"objects"},level_slider:{keywords:["scale"],"char":"\ud83c\udf9a",fitzpatrick_scale:!1,category:"objects"},control_knobs:{keywords:["dial"],"char":"\ud83c\udf9b",fitzpatrick_scale:!1,category:"objects"},compass:{keywords:["magnetic","navigation","orienteering"],"char":"\ud83e\udded",fitzpatrick_scale:!1,category:"objects"},stopwatch:{keywords:["time","deadline"],"char":"\u23f1",fitzpatrick_scale:!1,category:"objects"},timer_clock:{keywords:["alarm"],"char":"\u23f2",fitzpatrick_scale:!1,category:"objects"},alarm_clock:{keywords:["time","wake"],"char":"\u23f0",fitzpatrick_scale:!1,category:"objects"},mantelpiece_clock:{keywords:["time"],"char":"\ud83d\udd70",fitzpatrick_scale:!1,category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],"char":"\u23f3",fitzpatrick_scale:!1,category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],"char":"\u231b",fitzpatrick_scale:!1,category:"objects"},satellite:{keywords:["communication","future","radio","space"],"char":"\ud83d\udce1",fitzpatrick_scale:!1,category:"objects"},battery:{keywords:["power","energy","sustain"],"char":"\ud83d\udd0b",fitzpatrick_scale:!1,category:"objects"},electric_plug:{keywords:["charger","power"],"char":"\ud83d\udd0c",fitzpatrick_scale:!1,category:"objects"},bulb:{keywords:["light","electricity","idea"],"char":"\ud83d\udca1",fitzpatrick_scale:!1,category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],"char":"\ud83d\udd26",fitzpatrick_scale:!1,category:"objects"},candle:{keywords:["fire","wax"],"char":"\ud83d\udd6f",fitzpatrick_scale:!1,category:"objects"},fire_extinguisher:{keywords:["quench"],"char":"\ud83e\uddef",fitzpatrick_scale:!1,category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],"char":"\ud83d\uddd1",fitzpatrick_scale:!1,category:"objects"},oil_drum:{keywords:["barrell"],"char":"\ud83d\udee2",fitzpatrick_scale:!1,category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],"char":"\ud83d\udcb8",fitzpatrick_scale:!1,category:"objects"},dollar:{keywords:["money","sales","bill","currency"],"char":"\ud83d\udcb5",fitzpatrick_scale:!1,category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],"char":"\ud83d\udcb4",fitzpatrick_scale:!1,category:"objects"},euro:{keywords:["money","sales","dollar","currency"],"char":"\ud83d\udcb6",fitzpatrick_scale:!1,category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],"char":"\ud83d\udcb7",fitzpatrick_scale:!1,category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],"char":"\ud83d\udcb0",fitzpatrick_scale:!1,category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],"char":"\ud83d\udcb3",fitzpatrick_scale:!1,category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],"char":"\ud83d\udc8e",fitzpatrick_scale:!1,category:"objects"},balance_scale:{keywords:["law","fairness","weight"],"char":"\u2696",fitzpatrick_scale:!1,category:"objects"},toolbox:{keywords:["tools","diy","fix","maintainer","mechanic"],"char":"\ud83e\uddf0",fitzpatrick_scale:!1,category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],"char":"\ud83d\udd27",fitzpatrick_scale:!1,category:"objects"},hammer:{keywords:["tools","build","create"],"char":"\ud83d\udd28",fitzpatrick_scale:!1,category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],"char":"\u2692",fitzpatrick_scale:!1,category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],"char":"\ud83d\udee0",fitzpatrick_scale:!1,category:"objects"},pick:{keywords:["tools","dig"],"char":"\u26cf",fitzpatrick_scale:!1,category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],"char":"\ud83d\udd29",fitzpatrick_scale:!1,category:"objects"},gear:{keywords:["cog"],"char":"\u2699",fitzpatrick_scale:!1,category:"objects"},brick:{keywords:["bricks"],"char":"\ud83e\uddf1",fitzpatrick_scale:!1,category:"objects"},chains:{keywords:["lock","arrest"],"char":"\u26d3",fitzpatrick_scale:!1,category:"objects"},magnet:{keywords:["attraction","magnetic"],"char":"\ud83e\uddf2",fitzpatrick_scale:!1,category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],"char":"\ud83d\udd2b",fitzpatrick_scale:!1,category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],"char":"\ud83d\udca3",fitzpatrick_scale:!1,category:"objects"},firecracker:{keywords:["dynamite","boom","explode","explosion","explosive"],"char":"\ud83e\udde8",fitzpatrick_scale:!1,category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],"char":"\ud83d\udd2a",fitzpatrick_scale:!1,category:"objects"},dagger:{keywords:["weapon"],"char":"\ud83d\udde1",fitzpatrick_scale:!1,category:"objects"},crossed_swords:{keywords:["weapon"],"char":"\u2694",fitzpatrick_scale:!1,category:"objects"},shield:{keywords:["protection","security"],"char":"\ud83d\udee1",fitzpatrick_scale:!1,category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],"char":"\ud83d\udeac",fitzpatrick_scale:!1,category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary","death","pirate","evil"],"char":"\u2620",fitzpatrick_scale:!1,category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],"char":"\u26b0",fitzpatrick_scale:!1,category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],"char":"\u26b1",fitzpatrick_scale:!1,category:"objects"},amphora:{keywords:["vase","jar"],"char":"\ud83c\udffa",fitzpatrick_scale:!1,category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],"char":"\ud83d\udd2e",fitzpatrick_scale:!1,category:"objects"},prayer_beads:{keywords:["dhikr","religious"],"char":"\ud83d\udcff",fitzpatrick_scale:!1,category:"objects"},nazar_amulet:{keywords:["bead","charm"],"char":"\ud83e\uddff",fitzpatrick_scale:!1,category:"objects"},barber:{keywords:["hair","salon","style"],"char":"\ud83d\udc88",fitzpatrick_scale:!1,category:"objects"},alembic:{keywords:["distilling","science","experiment","chemistry"],"char":"\u2697",fitzpatrick_scale:!1,category:"objects"},telescope:{keywords:["stars","space","zoom","science","astronomy"],"char":"\ud83d\udd2d",fitzpatrick_scale:!1,category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],"char":"\ud83d\udd2c",fitzpatrick_scale:!1,category:"objects"},hole:{keywords:["embarrassing"],"char":"\ud83d\udd73",fitzpatrick_scale:!1,category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],"char":"\ud83d\udc8a",fitzpatrick_scale:!1,category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],"char":"\ud83d\udc89",fitzpatrick_scale:!1,category:"objects"},dna:{keywords:["biologist","genetics","life"],"char":"\ud83e\uddec",fitzpatrick_scale:!1,category:"objects"},microbe:{keywords:["amoeba","bacteria","germs"],"char":"\ud83e\udda0",fitzpatrick_scale:!1,category:"objects"},petri_dish:{keywords:["bacteria","biology","culture","lab"],"char":"\ud83e\uddeb",fitzpatrick_scale:!1,category:"objects"},test_tube:{keywords:["chemistry","experiment","lab","science"],"char":"\ud83e\uddea",fitzpatrick_scale:!1,category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],"char":"\ud83c\udf21",fitzpatrick_scale:!1,category:"objects"},broom:{keywords:["cleaning","sweeping","witch"],"char":"\ud83e\uddf9",fitzpatrick_scale:!1,category:"objects"},basket:{keywords:["laundry"],"char":"\ud83e\uddfa",fitzpatrick_scale:!1,category:"objects"},toilet_paper:{keywords:["roll"],"char":"\ud83e\uddfb",fitzpatrick_scale:!1,category:"objects"},label:{keywords:["sale","tag"],"char":"\ud83c\udff7",fitzpatrick_scale:!1,category:"objects"},bookmark:{keywords:["favorite","label","save"],"char":"\ud83d\udd16",fitzpatrick_scale:!1,category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],"char":"\ud83d\udebd",fitzpatrick_scale:!1,category:"objects"},shower:{keywords:["clean","water","bathroom"],"char":"\ud83d\udebf",fitzpatrick_scale:!1,category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],"char":"\ud83d\udec1",fitzpatrick_scale:!1,category:"objects"},soap:{keywords:["bar","bathing","cleaning","lather"],"char":"\ud83e\uddfc",fitzpatrick_scale:!1,category:"objects"},sponge:{keywords:["absorbing","cleaning","porous"],"char":"\ud83e\uddfd",fitzpatrick_scale:!1,category:"objects"},lotion_bottle:{keywords:["moisturizer","sunscreen"],"char":"\ud83e\uddf4",fitzpatrick_scale:!1,category:"objects"},key:{keywords:["lock","door","password"],"char":"\ud83d\udd11",fitzpatrick_scale:!1,category:"objects"},old_key:{keywords:["lock","door","password"],"char":"\ud83d\udddd",fitzpatrick_scale:!1,category:"objects"},couch_and_lamp:{keywords:["read","chill"],"char":"\ud83d\udecb",fitzpatrick_scale:!1,category:"objects"},sleeping_bed:{keywords:["bed","rest"],"char":"\ud83d\udecc",fitzpatrick_scale:!0,category:"objects"},bed:{keywords:["sleep","rest"],"char":"\ud83d\udecf",fitzpatrick_scale:!1,category:"objects"},door:{keywords:["house","entry","exit"],"char":"\ud83d\udeaa",fitzpatrick_scale:!1,category:"objects"},bellhop_bell:{keywords:["service"],"char":"\ud83d\udece",fitzpatrick_scale:!1,category:"objects"},teddy_bear:{keywords:["plush","stuffed"],"char":"\ud83e\uddf8",fitzpatrick_scale:!1,category:"objects"},framed_picture:{keywords:["photography"],"char":"\ud83d\uddbc",fitzpatrick_scale:!1,category:"objects"},world_map:{keywords:["location","direction"],"char":"\ud83d\uddfa",fitzpatrick_scale:!1,category:"objects"},parasol_on_ground:{keywords:["weather","summer"],"char":"\u26f1",fitzpatrick_scale:!1,category:"objects"},moyai:{keywords:["rock","easter island","moai"],"char":"\ud83d\uddff",fitzpatrick_scale:!1,category:"objects"},shopping:{keywords:["mall","buy","purchase"],"char":"\ud83d\udecd",fitzpatrick_scale:!1,category:"objects"},shopping_cart:{keywords:["trolley"],"char":"\ud83d\uded2",fitzpatrick_scale:!1,category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],"char":"\ud83c\udf88",fitzpatrick_scale:!1,category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],"char":"\ud83c\udf8f",fitzpatrick_scale:!1,category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],"char":"\ud83c\udf80",fitzpatrick_scale:!1,category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],"char":"\ud83c\udf81",fitzpatrick_scale:!1,category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],"char":"\ud83c\udf8a",fitzpatrick_scale:!1,category:"objects"},tada:{keywords:["party","congratulations","birthday","magic","circus","celebration"],"char":"\ud83c\udf89",fitzpatrick_scale:!1,category:"objects"},dolls:{keywords:["japanese","toy","kimono"],"char":"\ud83c\udf8e",fitzpatrick_scale:!1,category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],"char":"\ud83c\udf90",fitzpatrick_scale:!1,category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],"char":"\ud83c\udf8c",fitzpatrick_scale:!1,category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],"char":"\ud83c\udfee",fitzpatrick_scale:!1,category:"objects"},red_envelope:{keywords:["gift"],"char":"\ud83e\udde7",fitzpatrick_scale:!1,category:"objects"},email:{keywords:["letter","postal","inbox","communication"],"char":"\u2709\ufe0f",fitzpatrick_scale:!1,category:"objects"},envelope_with_arrow:{keywords:["email","communication"],"char":"\ud83d\udce9",fitzpatrick_scale:!1,category:"objects"},incoming_envelope:{keywords:["email","inbox"],"char":"\ud83d\udce8",fitzpatrick_scale:!1,category:"objects"},"e-mail":{keywords:["communication","inbox"],"char":"\ud83d\udce7",fitzpatrick_scale:!1,category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],"char":"\ud83d\udc8c",fitzpatrick_scale:!1,category:"objects"},postbox:{keywords:["email","letter","envelope"],"char":"\ud83d\udcee",fitzpatrick_scale:!1,category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],"char":"\ud83d\udcea",fitzpatrick_scale:!1,category:"objects"},mailbox:{keywords:["email","inbox","communication"],"char":"\ud83d\udceb",fitzpatrick_scale:!1,category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],"char":"\ud83d\udcec",fitzpatrick_scale:!1,category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],"char":"\ud83d\udced",fitzpatrick_scale:!1,category:"objects"},"package":{keywords:["mail","gift","cardboard","box","moving"],"char":"\ud83d\udce6",fitzpatrick_scale:!1,category:"objects"},postal_horn:{keywords:["instrument","music"],"char":"\ud83d\udcef",fitzpatrick_scale:!1,category:"objects"},inbox_tray:{keywords:["email","documents"],"char":"\ud83d\udce5",fitzpatrick_scale:!1,category:"objects"},outbox_tray:{keywords:["inbox","email"],"char":"\ud83d\udce4",fitzpatrick_scale:!1,category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],"char":"\ud83d\udcdc",fitzpatrick_scale:!1,category:"objects"},page_with_curl:{keywords:["documents","office","paper"],"char":"\ud83d\udcc3",fitzpatrick_scale:!1,category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],"char":"\ud83d\udcd1",fitzpatrick_scale:!1,category:"objects"},receipt:{keywords:["accounting","expenses"],"char":"\ud83e\uddfe",fitzpatrick_scale:!1,category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],"char":"\ud83d\udcca",fitzpatrick_scale:!1,category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],"char":"\ud83d\udcc8",fitzpatrick_scale:!1,category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],"char":"\ud83d\udcc9",fitzpatrick_scale:!1,category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],"char":"\ud83d\udcc4",fitzpatrick_scale:!1,category:"objects"},date:{keywords:["calendar","schedule"],"char":"\ud83d\udcc5",fitzpatrick_scale:!1,category:"objects"},calendar:{keywords:["schedule","date","planning"],"char":"\ud83d\udcc6",fitzpatrick_scale:!1,category:"objects"},spiral_calendar:{keywords:["date","schedule","planning"],"char":"\ud83d\uddd3",fitzpatrick_scale:!1,category:"objects"},card_index:{keywords:["business","stationery"],"char":"\ud83d\udcc7",fitzpatrick_scale:!1,category:"objects"},card_file_box:{keywords:["business","stationery"],"char":"\ud83d\uddc3",fitzpatrick_scale:!1,category:"objects"},ballot_box:{keywords:["election","vote"],"char":"\ud83d\uddf3",fitzpatrick_scale:!1,category:"objects"},file_cabinet:{keywords:["filing","organizing"],"char":"\ud83d\uddc4",fitzpatrick_scale:!1,category:"objects"},clipboard:{keywords:["stationery","documents"],"char":"\ud83d\udccb",fitzpatrick_scale:!1,category:"objects"},spiral_notepad:{keywords:["memo","stationery"],"char":"\ud83d\uddd2",fitzpatrick_scale:!1,category:"objects"},file_folder:{keywords:["documents","business","office"],"char":"\ud83d\udcc1",fitzpatrick_scale:!1,category:"objects"},open_file_folder:{keywords:["documents","load"],"char":"\ud83d\udcc2",fitzpatrick_scale:!1,category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],"char":"\ud83d\uddc2",fitzpatrick_scale:!1,category:"objects"},newspaper_roll:{keywords:["press","headline"],"char":"\ud83d\uddde",fitzpatrick_scale:!1,category:"objects"},newspaper:{keywords:["press","headline"],"char":"\ud83d\udcf0",fitzpatrick_scale:!1,category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],"char":"\ud83d\udcd3",fitzpatrick_scale:!1,category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],"char":"\ud83d\udcd5",fitzpatrick_scale:!1,category:"objects"},green_book:{keywords:["read","library","knowledge","study"],"char":"\ud83d\udcd7",fitzpatrick_scale:!1,category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],"char":"\ud83d\udcd8",fitzpatrick_scale:!1,category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],"char":"\ud83d\udcd9",fitzpatrick_scale:!1,category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],"char":"\ud83d\udcd4",fitzpatrick_scale:!1,category:"objects"},ledger:{keywords:["notes","paper"],"char":"\ud83d\udcd2",fitzpatrick_scale:!1,category:"objects"},books:{keywords:["literature","library","study"],"char":"\ud83d\udcda",fitzpatrick_scale:!1,category:"objects"},open_book:{keywords:["book","read","library","knowledge","literature","learn","study"],"char":"\ud83d\udcd6",fitzpatrick_scale:!1,category:"objects"},safety_pin:{keywords:["diaper"],"char":"\ud83e\uddf7",fitzpatrick_scale:!1,category:"objects"},link:{keywords:["rings","url"],"char":"\ud83d\udd17",fitzpatrick_scale:!1,category:"objects"},paperclip:{keywords:["documents","stationery"],"char":"\ud83d\udcce",fitzpatrick_scale:!1,category:"objects"},paperclips:{keywords:["documents","stationery"],"char":"\ud83d\udd87",fitzpatrick_scale:!1,category:"objects"},scissors:{keywords:["stationery","cut"],"char":"\u2702\ufe0f",fitzpatrick_scale:!1,category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],"char":"\ud83d\udcd0",fitzpatrick_scale:!1,category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],"char":"\ud83d\udccf",fitzpatrick_scale:!1,category:"objects"},abacus:{keywords:["calculation"],"char":"\ud83e\uddee",fitzpatrick_scale:!1,category:"objects"},pushpin:{keywords:["stationery","mark","here"],"char":"\ud83d\udccc",fitzpatrick_scale:!1,category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],"char":"\ud83d\udccd",fitzpatrick_scale:!1,category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],"char":"\ud83d\udea9",fitzpatrick_scale:!1,category:"objects"},white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],"char":"\ud83c\udff3",fitzpatrick_scale:!1,category:"objects"},black_flag:{keywords:["pirate"],"char":"\ud83c\udff4",fitzpatrick_scale:!1,category:"objects"},rainbow_flag:{keywords:["flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"],"char":"\ud83c\udff3\ufe0f\u200d\ud83c\udf08",fitzpatrick_scale:!1,category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],"char":"\ud83d\udd10",fitzpatrick_scale:!1,category:"objects"},lock:{keywords:["security","password","padlock"],"char":"\ud83d\udd12",fitzpatrick_scale:!1,category:"objects"},unlock:{keywords:["privacy","security"],"char":"\ud83d\udd13",fitzpatrick_scale:!1,category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],"char":"\ud83d\udd0f",fitzpatrick_scale:!1,category:"objects"},pen:{keywords:["stationery","writing","write"],"char":"\ud83d\udd8a",fitzpatrick_scale:!1,category:"objects"},fountain_pen:{keywords:["stationery","writing","write"],"char":"\ud83d\udd8b",fitzpatrick_scale:!1,category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],"char":"\u2712\ufe0f",fitzpatrick_scale:!1,category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],"char":"\ud83d\udcdd",fitzpatrick_scale:!1,category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],"char":"\u270f\ufe0f",fitzpatrick_scale:!1,category:"objects"},crayon:{keywords:["drawing","creativity"],"char":"\ud83d\udd8d",fitzpatrick_scale:!1,category:"objects"},paintbrush:{keywords:["drawing","creativity","art"],"char":"\ud83d\udd8c",fitzpatrick_scale:!1,category:"objects"},mag:{keywords:["search","zoom","find","detective"],"char":"\ud83d\udd0d",fitzpatrick_scale:!1,category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],"char":"\ud83d\udd0e",fitzpatrick_scale:!1,category:"objects"},heart:{keywords:["love","like","valentines"],"char":"\u2764\ufe0f",fitzpatrick_scale:!1,category:"symbols"},orange_heart:{keywords:["love","like","affection","valentines"],"char":"\ud83e\udde1",fitzpatrick_scale:!1,category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],"char":"\ud83d\udc9b",fitzpatrick_scale:!1,category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],"char":"\ud83d\udc9a",fitzpatrick_scale:!1,category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],"char":"\ud83d\udc99",fitzpatrick_scale:!1,category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],"char":"\ud83d\udc9c",fitzpatrick_scale:!1,category:"symbols"},black_heart:{keywords:["evil"],"char":"\ud83d\udda4",fitzpatrick_scale:!1,category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],"char":"\ud83d\udc94",fitzpatrick_scale:!1,category:"symbols"},heavy_heart_exclamation:{keywords:["decoration","love"],"char":"\u2763",fitzpatrick_scale:!1,category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],"char":"\ud83d\udc95",fitzpatrick_scale:!1,category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],"char":"\ud83d\udc9e",fitzpatrick_scale:!1,category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],"char":"\ud83d\udc93",fitzpatrick_scale:!1,category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],"char":"\ud83d\udc97",fitzpatrick_scale:!1,category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],"char":"\ud83d\udc96",fitzpatrick_scale:!1,category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],"char":"\ud83d\udc98",fitzpatrick_scale:!1,category:"symbols"},gift_heart:{keywords:["love","valentines"],"char":"\ud83d\udc9d",fitzpatrick_scale:!1,category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],"char":"\ud83d\udc9f",fitzpatrick_scale:!1,category:"symbols"},peace_symbol:{keywords:["hippie"],"char":"\u262e",fitzpatrick_scale:!1,category:"symbols"},latin_cross:{keywords:["christianity"],"char":"\u271d",fitzpatrick_scale:!1,category:"symbols"},star_and_crescent:{keywords:["islam"],"char":"\u262a",fitzpatrick_scale:!1,category:"symbols"},om:{keywords:["hinduism","buddhism","sikhism","jainism"],"char":"\ud83d\udd49",fitzpatrick_scale:!1,category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],"char":"\u2638",fitzpatrick_scale:!1,category:"symbols"},star_of_david:{keywords:["judaism"],"char":"\u2721",fitzpatrick_scale:!1,category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],"char":"\ud83d\udd2f",fitzpatrick_scale:!1,category:"symbols"},menorah:{keywords:["hanukkah","candles","jewish"],"char":"\ud83d\udd4e",fitzpatrick_scale:!1,category:"symbols"},yin_yang:{keywords:["balance"],"char":"\u262f",fitzpatrick_scale:!1,category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],"char":"\u2626",fitzpatrick_scale:!1,category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],"char":"\ud83d\uded0",fitzpatrick_scale:!1,category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],"char":"\u26ce",fitzpatrick_scale:!1,category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],"char":"\u2648",fitzpatrick_scale:!1,category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],"char":"\u2649",fitzpatrick_scale:!1,category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],"char":"\u264a",fitzpatrick_scale:!1,category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],"char":"\u264b",fitzpatrick_scale:!1,category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],"char":"\u264c",fitzpatrick_scale:!1,category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],"char":"\u264d",fitzpatrick_scale:!1,category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],"char":"\u264e",fitzpatrick_scale:!1,category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],"char":"\u264f",fitzpatrick_scale:!1,category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],"char":"\u2650",fitzpatrick_scale:!1,category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],"char":"\u2651",fitzpatrick_scale:!1,category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],"char":"\u2652",fitzpatrick_scale:!1,category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],"char":"\u2653",fitzpatrick_scale:!1,category:"symbols"},id:{keywords:["purple-square","words"],"char":"\ud83c\udd94",fitzpatrick_scale:!1,category:"symbols"},atom_symbol:{keywords:["science","physics","chemistry"],"char":"\u269b",fitzpatrick_scale:!1,category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],"char":"\ud83c\ude33",fitzpatrick_scale:!1,category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],"char":"\ud83c\ude39",fitzpatrick_scale:!1,category:"symbols"},radioactive:{keywords:["nuclear","danger"],"char":"\u2622",fitzpatrick_scale:!1,category:"symbols"},biohazard:{keywords:["danger"],"char":"\u2623",fitzpatrick_scale:!1,category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],"char":"\ud83d\udcf4",fitzpatrick_scale:!1,category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],"char":"\ud83d\udcf3",fitzpatrick_scale:!1,category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],"char":"\ud83c\ude36",fitzpatrick_scale:!1,category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],"char":"\ud83c\ude1a",fitzpatrick_scale:!1,category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],"char":"\ud83c\ude38",fitzpatrick_scale:!1,category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],"char":"\ud83c\ude3a",fitzpatrick_scale:!1,category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],"char":"\ud83c\ude37\ufe0f",fitzpatrick_scale:!1,category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],"char":"\u2734\ufe0f",fitzpatrick_scale:!1,category:"symbols"},vs:{keywords:["words","orange-square"],"char":"\ud83c\udd9a",fitzpatrick_scale:!1,category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],"char":"\ud83c\ude51",fitzpatrick_scale:!1,category:"symbols"},white_flower:{keywords:["japanese","spring"],"char":"\ud83d\udcae",fitzpatrick_scale:!1,category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],"char":"\ud83c\ude50",fitzpatrick_scale:!1,category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],"char":"\u3299\ufe0f",fitzpatrick_scale:!1,category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],"char":"\u3297\ufe0f",fitzpatrick_scale:!1,category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],"char":"\ud83c\ude34",fitzpatrick_scale:!1,category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],"char":"\ud83c\ude35",fitzpatrick_scale:!1,category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],"char":"\ud83c\ude32",fitzpatrick_scale:!1,category:"symbols"},a:{keywords:["red-square","alphabet","letter"],"char":"\ud83c\udd70\ufe0f",fitzpatrick_scale:!1,category:"symbols"},b:{keywords:["red-square","alphabet","letter"],"char":"\ud83c\udd71\ufe0f",fitzpatrick_scale:!1,category:"symbols"},ab:{keywords:["red-square","alphabet"],"char":"\ud83c\udd8e",fitzpatrick_scale:!1,category:"symbols"},cl:{keywords:["alphabet","words","red-square"],"char":"\ud83c\udd91",fitzpatrick_scale:!1,category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],"char":"\ud83c\udd7e\ufe0f",fitzpatrick_scale:!1,category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],"char":"\ud83c\udd98",fitzpatrick_scale:!1,category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],"char":"\u26d4",fitzpatrick_scale:!1,category:"symbols"},name_badge:{keywords:["fire","forbid"],"char":"\ud83d\udcdb",fitzpatrick_scale:!1,category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],"char":"\ud83d\udeab",fitzpatrick_scale:!1,category:"symbols"},x:{keywords:["no","delete","remove","cancel","red"],"char":"\u274c",fitzpatrick_scale:!1,category:"symbols"},o:{keywords:["circle","round"],"char":"\u2b55",fitzpatrick_scale:!1,category:"symbols"},stop_sign:{keywords:["stop"],"char":"\ud83d\uded1",fitzpatrick_scale:!1,category:"symbols"},anger:{keywords:["angry","mad"],"char":"\ud83d\udca2",fitzpatrick_scale:!1,category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],"char":"\u2668\ufe0f",fitzpatrick_scale:!1,category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],"char":"\ud83d\udeb7",fitzpatrick_scale:!1,category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],"char":"\ud83d\udeaf",fitzpatrick_scale:!1,category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],"char":"\ud83d\udeb3",fitzpatrick_scale:!1,category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],"char":"\ud83d\udeb1",fitzpatrick_scale:!1,category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],"char":"\ud83d\udd1e",fitzpatrick_scale:!1,category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],"char":"\ud83d\udcf5",fitzpatrick_scale:!1,category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],"char":"\u2757",fitzpatrick_scale:!1,category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],"char":"\u2755",fitzpatrick_scale:!1,category:"symbols"},question:{keywords:["doubt","confused"],"char":"\u2753",fitzpatrick_scale:!1,category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],"char":"\u2754",fitzpatrick_scale:!1,category:"symbols"},bangbang:{keywords:["exclamation","surprise"],"char":"\u203c\ufe0f",fitzpatrick_scale:!1,category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],"char":"\u2049\ufe0f",fitzpatrick_scale:!1,category:"symbols"},100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],"char":"\ud83d\udcaf",fitzpatrick_scale:!1,category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],"char":"\ud83d\udd05",fitzpatrick_scale:!1,category:"symbols"},high_brightness:{keywords:["sun","light"],"char":"\ud83d\udd06",fitzpatrick_scale:!1,category:"symbols"},trident:{keywords:["weapon","spear"],"char":"\ud83d\udd31",fitzpatrick_scale:!1,category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],"char":"\u269c",fitzpatrick_scale:!1,category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],"char":"\u303d\ufe0f",fitzpatrick_scale:!1,category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],"char":"\u26a0\ufe0f",fitzpatrick_scale:!1,category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],"char":"\ud83d\udeb8",fitzpatrick_scale:!1,category:"symbols"},beginner:{keywords:["badge","shield"],"char":"\ud83d\udd30",fitzpatrick_scale:!1,category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],"char":"\u267b\ufe0f",fitzpatrick_scale:!1,category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],"char":"\ud83c\ude2f",fitzpatrick_scale:!1,category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],"char":"\ud83d\udcb9",fitzpatrick_scale:!1,category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],"char":"\u2747\ufe0f",fitzpatrick_scale:!1,category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],"char":"\u2733\ufe0f",fitzpatrick_scale:!1,category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],"char":"\u274e",fitzpatrick_scale:!1,category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer","tick"],"char":"\u2705",fitzpatrick_scale:!1,category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],"char":"\ud83d\udca0",fitzpatrick_scale:!1,category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],"char":"\ud83c\udf00",fitzpatrick_scale:!1,category:"symbols"},loop:{keywords:["tape","cassette"],"char":"\u27bf",fitzpatrick_scale:!1,category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],"char":"\ud83c\udf10",fitzpatrick_scale:!1,category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],"char":"\u24c2\ufe0f",fitzpatrick_scale:!1,category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],"char":"\ud83c\udfe7",fitzpatrick_scale:!1,category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],"char":"\ud83c\ude02\ufe0f",fitzpatrick_scale:!1,category:"symbols"},passport_control:{keywords:["custom","blue-square"],"char":"\ud83d\udec2",fitzpatrick_scale:!1,category:"symbols"},customs:{keywords:["passport","border","blue-square"],"char":"\ud83d\udec3",fitzpatrick_scale:!1,category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],"char":"\ud83d\udec4",fitzpatrick_scale:!1,category:"symbols"},left_luggage:{keywords:["blue-square","travel"],"char":"\ud83d\udec5",fitzpatrick_scale:!1,category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],"char":"\u267f",fitzpatrick_scale:!1,category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],"char":"\ud83d\udead",fitzpatrick_scale:!1,category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],"char":"\ud83d\udebe",fitzpatrick_scale:!1,category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],"char":"\ud83c\udd7f\ufe0f",fitzpatrick_scale:!1,category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],"char":"\ud83d\udeb0",fitzpatrick_scale:!1,category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],"char":"\ud83d\udeb9",fitzpatrick_scale:!1,category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],"char":"\ud83d\udeba",fitzpatrick_scale:!1,category:"symbols"},baby_symbol:{keywords:["orange-square","child"],"char":"\ud83d\udebc",fitzpatrick_scale:!1,category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],"char":"\ud83d\udebb",fitzpatrick_scale:!1,category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],"char":"\ud83d\udeae",fitzpatrick_scale:!1,category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],"char":"\ud83c\udfa6",fitzpatrick_scale:!1,category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],"char":"\ud83d\udcf6",fitzpatrick_scale:!1,category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],"char":"\ud83c\ude01",fitzpatrick_scale:!1,category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],"char":"\ud83c\udd96",fitzpatrick_scale:!1,category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],"char":"\ud83c\udd97",fitzpatrick_scale:!1,category:"symbols"},up:{keywords:["blue-square","above","high"],"char":"\ud83c\udd99",fitzpatrick_scale:!1,category:"symbols"},cool:{keywords:["words","blue-square"],"char":"\ud83c\udd92",fitzpatrick_scale:!1,category:"symbols"},"new":{keywords:["blue-square","words","start"],"char":"\ud83c\udd95",fitzpatrick_scale:!1,category:"symbols"},free:{keywords:["blue-square","words"],"char":"\ud83c\udd93",fitzpatrick_scale:!1,category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],"char":"0\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},one:{keywords:["blue-square","numbers","1"],"char":"1\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],"char":"2\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],"char":"3\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},four:{keywords:["4","numbers","blue-square"],"char":"4\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],"char":"5\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},six:{keywords:["6","numbers","blue-square"],"char":"6\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],"char":"7\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},eight:{keywords:["8","blue-square","numbers"],"char":"8\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},nine:{keywords:["blue-square","numbers","9"],"char":"9\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],"char":"\ud83d\udd1f",fitzpatrick_scale:!1,category:"symbols"},asterisk:{keywords:["star","keycap"],"char":"*\u20e3",fitzpatrick_scale:!1,category:"symbols"},1234:{keywords:["numbers","blue-square"],"char":"\ud83d\udd22",fitzpatrick_scale:!1,category:"symbols"},eject_button:{keywords:["blue-square"],"char":"\u23cf\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],"char":"\u25b6\ufe0f",fitzpatrick_scale:!1,category:"symbols"},pause_button:{keywords:["pause","blue-square"],"char":"\u23f8",fitzpatrick_scale:!1,category:"symbols"},next_track_button:{keywords:["forward","next","blue-square"],"char":"\u23ed",fitzpatrick_scale:!1,category:"symbols"},stop_button:{keywords:["blue-square"],"char":"\u23f9",fitzpatrick_scale:!1,category:"symbols"},record_button:{keywords:["blue-square"],"char":"\u23fa",fitzpatrick_scale:!1,category:"symbols"},play_or_pause_button:{keywords:["blue-square","play","pause"],"char":"\u23ef",fitzpatrick_scale:!1,category:"symbols"},previous_track_button:{keywords:["backward"],"char":"\u23ee",fitzpatrick_scale:!1,category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],"char":"\u23e9",fitzpatrick_scale:!1,category:"symbols"},rewind:{keywords:["play","blue-square"],"char":"\u23ea",fitzpatrick_scale:!1,category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],"char":"\ud83d\udd00",fitzpatrick_scale:!1,category:"symbols"},repeat:{keywords:["loop","record"],"char":"\ud83d\udd01",fitzpatrick_scale:!1,category:"symbols"},repeat_one:{keywords:["blue-square","loop"],"char":"\ud83d\udd02",fitzpatrick_scale:!1,category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],"char":"\u25c0\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],"char":"\ud83d\udd3c",fitzpatrick_scale:!1,category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],"char":"\ud83d\udd3d",fitzpatrick_scale:!1,category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],"char":"\u23eb",fitzpatrick_scale:!1,category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],"char":"\u23ec",fitzpatrick_scale:!1,category:"symbols"},arrow_right:{keywords:["blue-square","next"],"char":"\u27a1\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],"char":"\u2b05\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],"char":"\u2b06\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],"char":"\u2b07\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],"char":"\u2197\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],"char":"\u2198\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],"char":"\u2199\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],"char":"\u2196\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],"char":"\u2195\ufe0f",fitzpatrick_scale:!1,category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],"char":"\u2194\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],"char":"\ud83d\udd04",fitzpatrick_scale:!1,category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],"char":"\u21aa\ufe0f",fitzpatrick_scale:!1,category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],"char":"\u21a9\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],"char":"\u2934\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],"char":"\u2935\ufe0f",fitzpatrick_scale:!1,category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],"char":"#\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],"char":"\u2139\ufe0f",fitzpatrick_scale:!1,category:"symbols"},abc:{keywords:["blue-square","alphabet"],"char":"\ud83d\udd24",fitzpatrick_scale:!1,category:"symbols"},abcd:{keywords:["blue-square","alphabet"],"char":"\ud83d\udd21",fitzpatrick_scale:!1,category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],"char":"\ud83d\udd20",fitzpatrick_scale:!1,category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],"char":"\ud83d\udd23",fitzpatrick_scale:!1,category:"symbols"},musical_note:{keywords:["score","tone","sound"],"char":"\ud83c\udfb5",fitzpatrick_scale:!1,category:"symbols"},notes:{keywords:["music","score"],"char":"\ud83c\udfb6",fitzpatrick_scale:!1,category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],"char":"\u3030\ufe0f",fitzpatrick_scale:!1,category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],"char":"\u27b0",fitzpatrick_scale:!1,category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],"char":"\u2714\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],"char":"\ud83d\udd03",fitzpatrick_scale:!1,category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],"char":"\u2795",fitzpatrick_scale:!1,category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],"char":"\u2796",fitzpatrick_scale:!1,category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],"char":"\u2797",fitzpatrick_scale:!1,category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],"char":"\u2716\ufe0f",fitzpatrick_scale:!1,category:"symbols"},infinity:{keywords:["forever"],"char":"\u267e",fitzpatrick_scale:!1,category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],"char":"\ud83d\udcb2",fitzpatrick_scale:!1,category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],"char":"\ud83d\udcb1",fitzpatrick_scale:!1,category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],"char":"\xa9\ufe0f",fitzpatrick_scale:!1,category:"symbols"},registered:{keywords:["alphabet","circle"],"char":"\xae\ufe0f",fitzpatrick_scale:!1,category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],"char":"\u2122\ufe0f",fitzpatrick_scale:!1,category:"symbols"},end:{keywords:["words","arrow"],"char":"\ud83d\udd1a",fitzpatrick_scale:!1,category:"symbols"},back:{keywords:["arrow","words","return"],"char":"\ud83d\udd19",fitzpatrick_scale:!1,category:"symbols"},on:{keywords:["arrow","words"],"char":"\ud83d\udd1b",fitzpatrick_scale:!1,category:"symbols"},top:{keywords:["words","blue-square"],"char":"\ud83d\udd1d",fitzpatrick_scale:!1,category:"symbols"},soon:{keywords:["arrow","words"],"char":"\ud83d\udd1c",fitzpatrick_scale:!1,category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes","tick"],"char":"\u2611\ufe0f",fitzpatrick_scale:!1,category:"symbols"},radio_button:{keywords:["input","old","music","circle"],"char":"\ud83d\udd18",fitzpatrick_scale:!1,category:"symbols"},white_circle:{keywords:["shape","round"],"char":"\u26aa",fitzpatrick_scale:!1,category:"symbols"},black_circle:{keywords:["shape","button","round"],"char":"\u26ab",fitzpatrick_scale:!1,category:"symbols"},red_circle:{keywords:["shape","error","danger"],"char":"\ud83d\udd34",fitzpatrick_scale:!1,category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],"char":"\ud83d\udd35",fitzpatrick_scale:!1,category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],"char":"\ud83d\udd38",fitzpatrick_scale:!1,category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],"char":"\ud83d\udd39",fitzpatrick_scale:!1,category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],"char":"\ud83d\udd36",fitzpatrick_scale:!1,category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],"char":"\ud83d\udd37",fitzpatrick_scale:!1,category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],"char":"\ud83d\udd3a",fitzpatrick_scale:!1,category:"symbols"},black_small_square:{keywords:["shape","icon"],"char":"\u25aa\ufe0f",fitzpatrick_scale:!1,category:"symbols"},white_small_square:{keywords:["shape","icon"],"char":"\u25ab\ufe0f",fitzpatrick_scale:!1,category:"symbols"},black_large_square:{keywords:["shape","icon","button"],"char":"\u2b1b",fitzpatrick_scale:!1,category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],"char":"\u2b1c",fitzpatrick_scale:!1,category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],"char":"\ud83d\udd3b",fitzpatrick_scale:!1,category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],"char":"\u25fc\ufe0f",fitzpatrick_scale:!1,category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],"char":"\u25fb\ufe0f",fitzpatrick_scale:!1,category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],"char":"\u25fe",fitzpatrick_scale:!1,category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],"char":"\u25fd",fitzpatrick_scale:!1,category:"symbols"},black_square_button:{keywords:["shape","input","frame"],"char":"\ud83d\udd32",fitzpatrick_scale:!1,category:"symbols"},white_square_button:{keywords:["shape","input"],"char":"\ud83d\udd33",fitzpatrick_scale:!1,category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],"char":"\ud83d\udd08",fitzpatrick_scale:!1,category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],"char":"\ud83d\udd09",fitzpatrick_scale:!1,category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],"char":"\ud83d\udd0a",fitzpatrick_scale:!1,category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],"char":"\ud83d\udd07",fitzpatrick_scale:!1,category:"symbols"},mega:{keywords:["sound","speaker","volume"],"char":"\ud83d\udce3",fitzpatrick_scale:!1,category:"symbols"},loudspeaker:{keywords:["volume","sound"],"char":"\ud83d\udce2",fitzpatrick_scale:!1,category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],"char":"\ud83d\udd14",fitzpatrick_scale:!1,category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],"char":"\ud83d\udd15",fitzpatrick_scale:!1,category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],"char":"\ud83c\udccf",fitzpatrick_scale:!1,category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],"char":"\ud83c\udc04",fitzpatrick_scale:!1,category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],"char":"\u2660\ufe0f",fitzpatrick_scale:!1,category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],"char":"\u2663\ufe0f",fitzpatrick_scale:!1,category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],"char":"\u2665\ufe0f",fitzpatrick_scale:!1,category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],"char":"\u2666\ufe0f",fitzpatrick_scale:!1,category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],"char":"\ud83c\udfb4",fitzpatrick_scale:!1,category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking","dream"],"char":"\ud83d\udcad",fitzpatrick_scale:!1,category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],"char":"\ud83d\uddef",fitzpatrick_scale:!1,category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],"char":"\ud83d\udcac",fitzpatrick_scale:!1,category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],"char":"\ud83d\udde8",fitzpatrick_scale:!1,category:"symbols"},clock1:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd50",fitzpatrick_scale:!1,category:"symbols"},clock2:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd51",fitzpatrick_scale:!1,category:"symbols"},clock3:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd52",fitzpatrick_scale:!1,category:"symbols"},clock4:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd53",fitzpatrick_scale:!1,category:"symbols"},clock5:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd54",fitzpatrick_scale:!1,category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],"char":"\ud83d\udd55",fitzpatrick_scale:!1,category:"symbols"},clock7:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd56",fitzpatrick_scale:!1,category:"symbols"},clock8:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd57",fitzpatrick_scale:!1,category:"symbols"},clock9:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd58",fitzpatrick_scale:!1,category:"symbols"},clock10:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd59",fitzpatrick_scale:!1,category:"symbols"},clock11:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd5a",fitzpatrick_scale:!1,category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],"char":"\ud83d\udd5b",fitzpatrick_scale:!1,category:"symbols"},clock130:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd5c",fitzpatrick_scale:!1,category:"symbols"},clock230:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd5d",fitzpatrick_scale:!1,category:"symbols"},clock330:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd5e",fitzpatrick_scale:!1,category:"symbols"},clock430:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd5f",fitzpatrick_scale:!1,category:"symbols"},clock530:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd60",fitzpatrick_scale:!1,category:"symbols"},clock630:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd61",fitzpatrick_scale:!1,category:"symbols"},clock730:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd62",fitzpatrick_scale:!1,category:"symbols"},clock830:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd63",fitzpatrick_scale:!1,category:"symbols"},clock930:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd64",fitzpatrick_scale:!1,category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd65",fitzpatrick_scale:!1,category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd66",fitzpatrick_scale:!1,category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],"char":"\ud83d\udd67",fitzpatrick_scale:!1,category:"symbols"},afghanistan:{keywords:["af","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},aland_islands:{keywords:["\xc5land","islands","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},albania:{keywords:["al","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},algeria:{keywords:["dz","flag","nation","country","banner"],"char":"\ud83c\udde9\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},american_samoa:{keywords:["american","ws","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},andorra:{keywords:["ad","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},angola:{keywords:["ao","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},anguilla:{keywords:["ai","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},antarctica:{keywords:["aq","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},antigua_barbuda:{keywords:["antigua","barbuda","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},argentina:{keywords:["ar","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},armenia:{keywords:["am","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},aruba:{keywords:["aw","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},australia:{keywords:["au","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},austria:{keywords:["at","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},azerbaijan:{keywords:["az","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},bahamas:{keywords:["bs","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},bahrain:{keywords:["bh","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},bangladesh:{keywords:["bd","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},barbados:{keywords:["bb","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},belarus:{keywords:["by","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},belgium:{keywords:["be","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},belize:{keywords:["bz","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},benin:{keywords:["bj","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},bermuda:{keywords:["bm","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},bhutan:{keywords:["bt","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},bolivia:{keywords:["bo","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},caribbean_netherlands:{keywords:["bonaire","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},bosnia_herzegovina:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},botswana:{keywords:["bw","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},brazil:{keywords:["br","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},british_indian_ocean_territory:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},british_virgin_islands:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],"char":"\ud83c\uddfb\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},brunei:{keywords:["bn","darussalam","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},bulgaria:{keywords:["bg","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},burkina_faso:{keywords:["burkina","faso","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},burundi:{keywords:["bi","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},cape_verde:{keywords:["cabo","verde","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},cambodia:{keywords:["kh","flag","nation","country","banner"],"char":"\ud83c\uddf0\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},cameroon:{keywords:["cm","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},canada:{keywords:["ca","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},canary_islands:{keywords:["canary","islands","flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},cayman_islands:{keywords:["cayman","islands","flag","nation","country","banner"],"char":"\ud83c\uddf0\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},central_african_republic:{keywords:["central","african","republic","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},chad:{keywords:["td","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},chile:{keywords:["flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],"char":"\ud83c\udde8\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},christmas_island:{keywords:["christmas","island","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},cocos_islands:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},colombia:{keywords:["co","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},comoros:{keywords:["km","flag","nation","country","banner"],"char":"\ud83c\uddf0\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},congo_brazzaville:{keywords:["congo","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},congo_kinshasa:{keywords:["congo","democratic","republic","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},cook_islands:{keywords:["cook","islands","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},costa_rica:{keywords:["costa","rica","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},croatia:{keywords:["hr","flag","nation","country","banner"],"char":"\ud83c\udded\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},cuba:{keywords:["cu","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},curacao:{keywords:["cura\xe7ao","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},cyprus:{keywords:["cy","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},czech_republic:{keywords:["cz","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},denmark:{keywords:["dk","flag","nation","country","banner"],"char":"\ud83c\udde9\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},djibouti:{keywords:["dj","flag","nation","country","banner"],"char":"\ud83c\udde9\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},dominica:{keywords:["dm","flag","nation","country","banner"],"char":"\ud83c\udde9\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},dominican_republic:{keywords:["dominican","republic","flag","nation","country","banner"],"char":"\ud83c\udde9\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},ecuador:{keywords:["ec","flag","nation","country","banner"],"char":"\ud83c\uddea\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},egypt:{keywords:["eg","flag","nation","country","banner"],"char":"\ud83c\uddea\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},el_salvador:{keywords:["el","salvador","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},equatorial_guinea:{keywords:["equatorial","gn","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},eritrea:{keywords:["er","flag","nation","country","banner"],"char":"\ud83c\uddea\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},estonia:{keywords:["ee","flag","nation","country","banner"],"char":"\ud83c\uddea\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},ethiopia:{keywords:["et","flag","nation","country","banner"],"char":"\ud83c\uddea\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},eu:{keywords:["european","union","flag","banner"],"char":"\ud83c\uddea\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},falkland_islands:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],"char":"\ud83c\uddeb\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},faroe_islands:{keywords:["faroe","islands","flag","nation","country","banner"],"char":"\ud83c\uddeb\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},fiji:{keywords:["fj","flag","nation","country","banner"],"char":"\ud83c\uddeb\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},finland:{keywords:["fi","flag","nation","country","banner"],"char":"\ud83c\uddeb\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],"char":"\ud83c\uddeb\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},french_guiana:{keywords:["french","guiana","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},french_polynesia:{keywords:["french","polynesia","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},french_southern_territories:{keywords:["french","southern","territories","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},gabon:{keywords:["ga","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},gambia:{keywords:["gm","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},georgia:{keywords:["ge","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},de:{keywords:["german","nation","flag","country","banner"],"char":"\ud83c\udde9\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},ghana:{keywords:["gh","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},gibraltar:{keywords:["gi","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},greece:{keywords:["gr","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},greenland:{keywords:["gl","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},grenada:{keywords:["gd","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},guadeloupe:{keywords:["gp","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},guam:{keywords:["gu","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},guatemala:{keywords:["gt","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},guernsey:{keywords:["gg","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},guinea:{keywords:["gn","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},guinea_bissau:{keywords:["gw","bissau","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},guyana:{keywords:["gy","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},haiti:{keywords:["ht","flag","nation","country","banner"],"char":"\ud83c\udded\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},honduras:{keywords:["hn","flag","nation","country","banner"],"char":"\ud83c\udded\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},hong_kong:{keywords:["hong","kong","flag","nation","country","banner"],"char":"\ud83c\udded\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},hungary:{keywords:["hu","flag","nation","country","banner"],"char":"\ud83c\udded\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},iceland:{keywords:["is","flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},india:{keywords:["in","flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},iran:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},iraq:{keywords:["iq","flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},ireland:{keywords:["ie","flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},isle_of_man:{keywords:["isle","man","flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},israel:{keywords:["il","flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],"char":"\ud83c\uddee\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},cote_divoire:{keywords:["ivory","coast","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},jamaica:{keywords:["jm","flag","nation","country","banner"],"char":"\ud83c\uddef\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],"char":"\ud83c\uddef\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},jersey:{keywords:["je","flag","nation","country","banner"],"char":"\ud83c\uddef\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},jordan:{keywords:["jo","flag","nation","country","banner"],"char":"\ud83c\uddef\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},kazakhstan:{keywords:["kz","flag","nation","country","banner"],"char":"\ud83c\uddf0\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},kenya:{keywords:["ke","flag","nation","country","banner"],"char":"\ud83c\uddf0\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},kiribati:{keywords:["ki","flag","nation","country","banner"],"char":"\ud83c\uddf0\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},kosovo:{keywords:["xk","flag","nation","country","banner"],"char":"\ud83c\uddfd\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},kuwait:{keywords:["kw","flag","nation","country","banner"],"char":"\ud83c\uddf0\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},kyrgyzstan:{keywords:["kg","flag","nation","country","banner"],"char":"\ud83c\uddf0\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},laos:{keywords:["lao","democratic","republic","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},latvia:{keywords:["lv","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},lebanon:{keywords:["lb","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},lesotho:{keywords:["ls","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},liberia:{keywords:["lr","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},libya:{keywords:["ly","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},liechtenstein:{keywords:["li","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},lithuania:{keywords:["lt","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},luxembourg:{keywords:["lu","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},macau:{keywords:["macao","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},macedonia:{keywords:["macedonia,","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},madagascar:{keywords:["mg","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},malawi:{keywords:["mw","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},malaysia:{keywords:["my","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},maldives:{keywords:["mv","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},mali:{keywords:["ml","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},malta:{keywords:["mt","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},marshall_islands:{keywords:["marshall","islands","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},martinique:{keywords:["mq","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},mauritania:{keywords:["mr","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},mauritius:{keywords:["mu","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},mayotte:{keywords:["yt","flag","nation","country","banner"],"char":"\ud83c\uddfe\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},mexico:{keywords:["mx","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},micronesia:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],"char":"\ud83c\uddeb\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},moldova:{keywords:["moldova,","republic","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},monaco:{keywords:["mc","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},mongolia:{keywords:["mn","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},montenegro:{keywords:["me","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},montserrat:{keywords:["ms","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},morocco:{keywords:["ma","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},mozambique:{keywords:["mz","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},myanmar:{keywords:["mm","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},namibia:{keywords:["na","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},nauru:{keywords:["nr","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},nepal:{keywords:["np","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},netherlands:{keywords:["nl","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},new_caledonia:{keywords:["new","caledonia","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},new_zealand:{keywords:["new","zealand","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},nicaragua:{keywords:["ni","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},niger:{keywords:["ne","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},niue:{keywords:["nu","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},norfolk_island:{keywords:["norfolk","island","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},northern_mariana_islands:{keywords:["northern","mariana","islands","flag","nation","country","banner"],"char":"\ud83c\uddf2\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},north_korea:{keywords:["north","korea","nation","flag","country","banner"],"char":"\ud83c\uddf0\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},norway:{keywords:["no","flag","nation","country","banner"],"char":"\ud83c\uddf3\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},oman:{keywords:["om_symbol","flag","nation","country","banner"],"char":"\ud83c\uddf4\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},pakistan:{keywords:["pk","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},palau:{keywords:["pw","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},palestinian_territories:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},panama:{keywords:["pa","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},papua_new_guinea:{keywords:["papua","new","guinea","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},paraguay:{keywords:["py","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},peru:{keywords:["pe","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},philippines:{keywords:["ph","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},pitcairn_islands:{keywords:["pitcairn","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},poland:{keywords:["pl","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},portugal:{keywords:["pt","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},puerto_rico:{keywords:["puerto","rico","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},qatar:{keywords:["qa","flag","nation","country","banner"],"char":"\ud83c\uddf6\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},reunion:{keywords:["r\xe9union","flag","nation","country","banner"],"char":"\ud83c\uddf7\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},romania:{keywords:["ro","flag","nation","country","banner"],"char":"\ud83c\uddf7\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],"char":"\ud83c\uddf7\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},rwanda:{keywords:["rw","flag","nation","country","banner"],"char":"\ud83c\uddf7\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},st_barthelemy:{keywords:["saint","barth\xe9lemy","flag","nation","country","banner"],"char":"\ud83c\udde7\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},st_helena:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},st_kitts_nevis:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],"char":"\ud83c\uddf0\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},st_lucia:{keywords:["saint","lucia","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},st_pierre_miquelon:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],"char":"\ud83c\uddf5\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},st_vincent_grenadines:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],"char":"\ud83c\uddfb\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},samoa:{keywords:["ws","flag","nation","country","banner"],"char":"\ud83c\uddfc\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},san_marino:{keywords:["san","marino","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},sao_tome_principe:{keywords:["sao","tome","principe","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},senegal:{keywords:["sn","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},serbia:{keywords:["rs","flag","nation","country","banner"],"char":"\ud83c\uddf7\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},seychelles:{keywords:["sc","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},sierra_leone:{keywords:["sierra","leone","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},singapore:{keywords:["sg","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},sint_maarten:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},slovakia:{keywords:["sk","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},slovenia:{keywords:["si","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},solomon_islands:{keywords:["solomon","islands","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},somalia:{keywords:["so","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},south_africa:{keywords:["south","africa","flag","nation","country","banner"],"char":"\ud83c\uddff\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},south_georgia_south_sandwich_islands:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],"char":"\ud83c\uddec\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],"char":"\ud83c\uddf0\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},south_sudan:{keywords:["south","sd","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],"char":"\ud83c\uddea\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},sri_lanka:{keywords:["sri","lanka","flag","nation","country","banner"],"char":"\ud83c\uddf1\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},sudan:{keywords:["sd","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},suriname:{keywords:["sr","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},swaziland:{keywords:["sz","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},sweden:{keywords:["se","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},switzerland:{keywords:["ch","flag","nation","country","banner"],"char":"\ud83c\udde8\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},syria:{keywords:["syrian","arab","republic","flag","nation","country","banner"],"char":"\ud83c\uddf8\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},taiwan:{keywords:["tw","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},tajikistan:{keywords:["tj","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},tanzania:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},thailand:{keywords:["th","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},timor_leste:{keywords:["timor","leste","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},togo:{keywords:["tg","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},tokelau:{keywords:["tk","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},tonga:{keywords:["to","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},trinidad_tobago:{keywords:["trinidad","tobago","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},tunisia:{keywords:["tn","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},turks_caicos_islands:{keywords:["turks","caicos","islands","flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],"char":"\ud83c\uddf9\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},uganda:{keywords:["ug","flag","nation","country","banner"],"char":"\ud83c\uddfa\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},ukraine:{keywords:["ua","flag","nation","country","banner"],"char":"\ud83c\uddfa\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},united_arab_emirates:{keywords:["united","arab","emirates","flag","nation","country","banner"],"char":"\ud83c\udde6\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},uk:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],"char":"\ud83c\uddec\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},england:{keywords:["flag","english"],"char":"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f",fitzpatrick_scale:!1,category:"flags"},scotland:{keywords:["flag","scottish"],"char":"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f",fitzpatrick_scale:!1,category:"flags"},wales:{keywords:["flag","welsh"],"char":"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f",fitzpatrick_scale:!1,category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],"char":"\ud83c\uddfa\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},us_virgin_islands:{keywords:["virgin","islands","us","flag","nation","country","banner"],"char":"\ud83c\uddfb\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},uruguay:{keywords:["uy","flag","nation","country","banner"],"char":"\ud83c\uddfa\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},uzbekistan:{keywords:["uz","flag","nation","country","banner"],"char":"\ud83c\uddfa\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},vanuatu:{keywords:["vu","flag","nation","country","banner"],"char":"\ud83c\uddfb\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},vatican_city:{keywords:["vatican","city","flag","nation","country","banner"],"char":"\ud83c\uddfb\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},venezuela:{keywords:["ve","bolivarian","republic","flag","nation","country","banner"],"char":"\ud83c\uddfb\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},vietnam:{keywords:["viet","nam","flag","nation","country","banner"],"char":"\ud83c\uddfb\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},wallis_futuna:{keywords:["wallis","futuna","flag","nation","country","banner"],"char":"\ud83c\uddfc\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},western_sahara:{keywords:["western","sahara","flag","nation","country","banner"],"char":"\ud83c\uddea\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},yemen:{keywords:["ye","flag","nation","country","banner"],"char":"\ud83c\uddfe\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},zambia:{keywords:["zm","flag","nation","country","banner"],"char":"\ud83c\uddff\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},zimbabwe:{keywords:["zw","flag","nation","country","banner"],"char":"\ud83c\uddff\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},united_nations:{keywords:["un","flag","banner"],"char":"\ud83c\uddfa\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},pirate_flag:{keywords:["skull","crossbones","flag","banner"],"char":"\ud83c\udff4\u200d\u2620\ufe0f",fitzpatrick_scale:!1,category:"flags"}}); \ No newline at end of file diff --git a/src/assets/tinymce/plugins/emoticons/plugin.js b/src/assets/tinymce/plugins/emoticons/plugin.js new file mode 100644 index 00000000..e939611e --- /dev/null +++ b/src/assets/tinymce/plugins/emoticons/plugin.js @@ -0,0 +1,605 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var DEFAULT_ID = 'tinymce.plugins.emoticons'; + var getEmoticonDatabase = function (editor) { + return editor.getParam('emoticons_database', 'emojis', 'string'); + }; + var getEmoticonDatabaseUrl = function (editor, pluginUrl) { + var database = getEmoticonDatabase(editor); + return editor.getParam('emoticons_database_url', pluginUrl + '/js/' + database + editor.suffix + '.js', 'string'); + }; + var getEmoticonDatabaseId = function (editor) { + return editor.getParam('emoticons_database_id', DEFAULT_ID, 'string'); + }; + var getAppendedEmoticons = function (editor) { + return editor.getParam('emoticons_append', {}, 'object'); + }; + var getEmotionsImageUrl = function (editor) { + return editor.getParam('emoticons_images_url', 'https://twemoji.maxcdn.com/v/13.0.1/72x72/', 'string'); + }; + + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var hasOwnProperty = Object.prototype.hasOwnProperty; + var shallow = function (old, nu) { + return nu; + }; + var baseMerge = function (merger) { + return function () { + var objects = new Array(arguments.length); + for (var i = 0; i < objects.length; i++) { + objects[i] = arguments[i]; + } + if (objects.length === 0) { + throw new Error('Can\'t merge zero objects'); + } + var ret = {}; + for (var j = 0; j < objects.length; j++) { + var curObject = objects[j]; + for (var key in curObject) { + if (hasOwnProperty.call(curObject, key)) { + ret[key] = merger(ret[key], curObject[key]); + } + } + } + return ret; + }; + }; + var merge = baseMerge(shallow); + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Optional = { + some: some, + none: none, + from: from + }; + + var keys = Object.keys; + var hasOwnProperty$1 = Object.hasOwnProperty; + var each = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + var map = function (obj, f) { + return tupleMap(obj, function (x, i) { + return { + k: i, + v: f(x, i) + }; + }); + }; + var tupleMap = function (obj, f) { + var r = {}; + each(obj, function (x, i) { + var tuple = f(x, i); + r[tuple.k] = tuple.v; + }); + return r; + }; + var has = function (obj, key) { + return hasOwnProperty$1.call(obj, key); + }; + + var checkRange = function (str, substr, start) { + return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr; + }; + var contains = function (str, substr) { + return str.indexOf(substr) !== -1; + }; + var startsWith = function (str, prefix) { + return checkRange(str, prefix, 0); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.Resource'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var ALL_CATEGORY = 'All'; + var categoryNameMap = { + symbols: 'Symbols', + people: 'People', + animals_and_nature: 'Animals and Nature', + food_and_drink: 'Food and Drink', + activity: 'Activity', + travel_and_places: 'Travel and Places', + objects: 'Objects', + flags: 'Flags', + user: 'User Defined' + }; + var translateCategory = function (categories, name) { + return has(categories, name) ? categories[name] : name; + }; + var getUserDefinedEmoticons = function (editor) { + var userDefinedEmoticons = getAppendedEmoticons(editor); + return map(userDefinedEmoticons, function (value) { + return __assign({ + keywords: [], + category: 'user' + }, value); + }); + }; + var initDatabase = function (editor, databaseUrl, databaseId) { + var categories = Cell(Optional.none()); + var all = Cell(Optional.none()); + var emojiImagesUrl = getEmotionsImageUrl(editor); + var getEmoji = function (lib) { + if (startsWith(lib.char, '= max; + }; + }); + for (var i = 0; i < list.length; i++) { + if (pattern.length === 0 || emojiMatches(list[i], lowerCasePattern)) { + matches.push({ + value: list[i].char, + text: list[i].title, + icon: list[i].char + }); + if (reachedLimit(matches.length)) { + break; + } + } + } + return matches; + }; + + var init = function (editor, database) { + editor.ui.registry.addAutocompleter('emoticons', { + ch: ':', + columns: 'auto', + minChars: 2, + fetch: function (pattern, maxResults) { + return database.waitForLoad().then(function () { + var candidates = database.listAll(); + return emojisFrom(candidates, pattern, Optional.some(maxResults)); + }); + }, + onAction: function (autocompleteApi, rng, value) { + editor.selection.setRng(rng); + editor.insertContent(value); + autocompleteApi.hide(); + } + }); + }; + + var last = function (fn, rate) { + var timer = null; + var cancel = function () { + if (timer !== null) { + clearTimeout(timer); + timer = null; + } + }; + var throttle = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (timer !== null) { + clearTimeout(timer); + } + timer = setTimeout(function () { + fn.apply(null, args); + timer = null; + }, rate); + }; + return { + cancel: cancel, + throttle: throttle + }; + }; + + var insertEmoticon = function (editor, ch) { + editor.insertContent(ch); + }; + + var patternName = 'pattern'; + var open = function (editor, database) { + var initialState = { + pattern: '', + results: emojisFrom(database.listAll(), '', Optional.some(300)) + }; + var currentTab = Cell(ALL_CATEGORY); + var scan = function (dialogApi) { + var dialogData = dialogApi.getData(); + var category = currentTab.get(); + var candidates = database.listCategory(category); + var results = emojisFrom(candidates, dialogData[patternName], category === ALL_CATEGORY ? Optional.some(300) : Optional.none()); + dialogApi.setData({ results: results }); + }; + var updateFilter = last(function (dialogApi) { + scan(dialogApi); + }, 200); + var searchField = { + label: 'Search', + type: 'input', + name: patternName + }; + var resultsField = { + type: 'collection', + name: 'results' + }; + var getInitialState = function () { + var body = { + type: 'tabpanel', + tabs: map$1(database.listCategories(), function (cat) { + return { + title: cat, + name: cat, + items: [ + searchField, + resultsField + ] + }; + }) + }; + return { + title: 'Emoticons', + size: 'normal', + body: body, + initialData: initialState, + onTabChange: function (dialogApi, details) { + currentTab.set(details.newTabName); + updateFilter.throttle(dialogApi); + }, + onChange: updateFilter.throttle, + onAction: function (dialogApi, actionData) { + if (actionData.name === 'results') { + insertEmoticon(editor, actionData.value); + dialogApi.close(); + } + }, + buttons: [{ + type: 'cancel', + text: 'Close', + primary: true + }] + }; + }; + var dialogApi = editor.windowManager.open(getInitialState()); + dialogApi.focus(patternName); + if (!database.hasLoaded()) { + dialogApi.block('Loading emoticons...'); + database.waitForLoad().then(function () { + dialogApi.redial(getInitialState()); + updateFilter.throttle(dialogApi); + dialogApi.focus(patternName); + dialogApi.unblock(); + }).catch(function (_err) { + dialogApi.redial({ + title: 'Emoticons', + body: { + type: 'panel', + items: [{ + type: 'alertbanner', + level: 'error', + icon: 'warning', + text: '

Could not load emoticons

' + }] + }, + buttons: [{ + type: 'cancel', + text: 'Close', + primary: true + }], + initialData: { + pattern: '', + results: [] + } + }); + dialogApi.focus(patternName); + dialogApi.unblock(); + }); + } + }; + + var register = function (editor, database) { + var onAction = function () { + return open(editor, database); + }; + editor.ui.registry.addButton('emoticons', { + tooltip: 'Emoticons', + icon: 'emoji', + onAction: onAction + }); + editor.ui.registry.addMenuItem('emoticons', { + text: 'Emoticons...', + icon: 'emoji', + onAction: onAction + }); + }; + + function Plugin () { + global.add('emoticons', function (editor, pluginUrl) { + var databaseUrl = getEmoticonDatabaseUrl(editor, pluginUrl); + var databaseId = getEmoticonDatabaseId(editor); + var database = initDatabase(editor, databaseUrl, databaseId); + register(editor, database); + init(editor, database); + setup(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/emoticons/plugin.min.js b/src/assets/tinymce/plugins/emoticons/plugin.min.js new file mode 100644 index 00000000..250d7865 --- /dev/null +++ b/src/assets/tinymce/plugins/emoticons/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var u,t,n,e,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),o=function(){return(o=Object.assign||function(t){for(var n,e=1,r=arguments.length;e=i.length&&o.substr(u,u+i.length)===i?e["char"].replace(/src="([^"]+)"/,function(t,n){return'src="'+f+n+'"'}):e["char"]),category:_(A,t.category)},c=l[a.category]!==undefined?l[a.category]:[];l[a.category]=c.concat([a]),s.push(a)}),r.set(h.some(l)),n.set(h.some(s))};e.on("init",function(){O.load(t,o).then(function(t){var n=T(e);i(c(t,n))},function(t){console.log("Failed to load emoticons: "+t),r.set(h.some({})),n.set(h.some([]))})});var u=function(){return n.get().getOr([])},a=function(){return r.get().isSome()&&n.get().isSome()};return{listCategories:function(){return[k].concat(y(r.get().getOr({})))},hasLoaded:a,waitForLoad:function(){return a()?j.resolve(!0):new j(function(t,n){var e=15,r=C.setInterval(function(){a()?(C.clearInterval(r),t(!0)):--e<0&&(console.log("Could not load emojis from url: "+o),C.clearInterval(r),n(!1))},100)})},listAll:u,listCategory:function(n){return n===k?u():r.get().bind(function(t){return h.from(t[n])}).getOr([])}}},x=function(t,n,e){for(var r=[],o=n.toLowerCase(),i=e.fold(function(){return l},function(n){return function(t){return n<=t}}),u=0;uCould not load emoticons

"}]},buttons:[{type:"cancel",text:"Close",primary:!0}],initialData:{pattern:"",results:[]}}),f.focus(D),f.unblock()}))};r.add("emoticons",function(t,n){var e,r,o,i,u,a,c,l,s,f=(r=n,o=(e=t).getParam("emoticons_database","emojis","string"),e.getParam("emoticons_database_url",r+"/js/"+o+e.suffix+".js","string")),m=t.getParam("emoticons_database_id","tinymce.plugins.emoticons","string"),g=P(t,f,m);u=g,a=function(){return L(i,u)},(i=t).ui.registry.addButton("emoticons",{tooltip:"Emoticons",icon:"emoji",onAction:a}),i.ui.registry.addMenuItem("emoticons",{text:"Emoticons...",icon:"emoji",onAction:a}),l=g,(c=t).ui.registry.addAutocompleter("emoticons",{ch:":",columns:"auto",minChars:2,fetch:function(n,e){return l.waitForLoad().then(function(){var t=l.listAll();return x(t,n,h.some(e))})},onAction:function(t,n,e){c.selection.setRng(n),c.insertContent(e),t.hide()}}),(s=t).on("PreInit",function(){s.parser.addAttributeFilter("data-emoticon",function(t){!function(t,n){for(var e=0,r=t.length;e'); + }; + var getProtect = function (editor) { + return editor.getParam('protect'); + }; + + var parseHeader = function (head) { + return global$2({ + validate: false, + root_name: '#document' + }).parse(head, { format: 'xhtml' }); + }; + var htmlToData = function (editor, head) { + var headerFragment = parseHeader(head); + var data = {}; + var elm, matches; + function getAttr(elm, name) { + var value = elm.attr(name); + return value || ''; + } + data.fontface = getDefaultFontFamily(editor); + data.fontsize = getDefaultFontSize(editor); + elm = headerFragment.firstChild; + if (elm.type === 7) { + data.xml_pi = true; + matches = /encoding="([^"]+)"/.exec(elm.value); + if (matches) { + data.docencoding = matches[1]; + } + } + elm = headerFragment.getAll('#doctype')[0]; + if (elm) { + data.doctype = ''; + } + elm = headerFragment.getAll('title')[0]; + if (elm && elm.firstChild) { + data.title = elm.firstChild.value; + } + global$1.each(headerFragment.getAll('meta'), function (meta) { + var name = meta.attr('name'); + var httpEquiv = meta.attr('http-equiv'); + var matches; + if (name) { + data[name.toLowerCase()] = meta.attr('content'); + } else if (httpEquiv === 'Content-Type') { + matches = /charset\s*=\s*(.*)\s*/gi.exec(meta.attr('content')); + if (matches) { + data.docencoding = matches[1]; + } + } + }); + elm = headerFragment.getAll('html')[0]; + if (elm) { + data.langcode = getAttr(elm, 'lang') || getAttr(elm, 'xml:lang'); + } + data.stylesheets = []; + global$1.each(headerFragment.getAll('link'), function (link) { + if (link.attr('rel') === 'stylesheet') { + data.stylesheets.push(link.attr('href')); + } + }); + elm = headerFragment.getAll('body')[0]; + if (elm) { + data.langdir = getAttr(elm, 'dir'); + data.style = getAttr(elm, 'style'); + data.visited_color = getAttr(elm, 'vlink'); + data.link_color = getAttr(elm, 'link'); + data.active_color = getAttr(elm, 'alink'); + } + return data; + }; + var dataToHtml = function (editor, data, head) { + var headElement, elm, value; + var dom = editor.dom; + function setAttr(elm, name, value) { + elm.attr(name, value ? value : undefined); + } + function addHeadNode(node) { + if (headElement.firstChild) { + headElement.insert(node, headElement.firstChild); + } else { + headElement.append(node); + } + } + var headerFragment = parseHeader(head); + headElement = headerFragment.getAll('head')[0]; + if (!headElement) { + elm = headerFragment.getAll('html')[0]; + headElement = new global$3('head', 1); + if (elm.firstChild) { + elm.insert(headElement, elm.firstChild, true); + } else { + elm.append(headElement); + } + } + elm = headerFragment.firstChild; + if (data.xml_pi) { + value = 'version="1.0"'; + if (data.docencoding) { + value += ' encoding="' + data.docencoding + '"'; + } + if (elm.type !== 7) { + elm = new global$3('xml', 7); + headerFragment.insert(elm, headerFragment.firstChild, true); + } + elm.value = value; + } else if (elm && elm.type === 7) { + elm.remove(); + } + elm = headerFragment.getAll('#doctype')[0]; + if (data.doctype) { + if (!elm) { + elm = new global$3('#doctype', 10); + if (data.xml_pi) { + headerFragment.insert(elm, headerFragment.firstChild); + } else { + addHeadNode(elm); + } + } + elm.value = data.doctype.substring(9, data.doctype.length - 1); + } else if (elm) { + elm.remove(); + } + elm = null; + global$1.each(headerFragment.getAll('meta'), function (meta) { + if (meta.attr('http-equiv') === 'Content-Type') { + elm = meta; + } + }); + if (data.docencoding) { + if (!elm) { + elm = new global$3('meta', 1); + elm.attr('http-equiv', 'Content-Type'); + elm.shortEnded = true; + addHeadNode(elm); + } + elm.attr('content', 'text/html; charset=' + data.docencoding); + } else if (elm) { + elm.remove(); + } + elm = headerFragment.getAll('title')[0]; + if (data.title) { + if (!elm) { + elm = new global$3('title', 1); + addHeadNode(elm); + } else { + elm.empty(); + } + elm.append(new global$3('#text', 3)).value = data.title; + } else if (elm) { + elm.remove(); + } + global$1.each('keywords,description,author,copyright,robots'.split(','), function (name) { + var nodes = headerFragment.getAll('meta'); + var i, meta; + var value = data[name]; + for (i = 0; i < nodes.length; i++) { + meta = nodes[i]; + if (meta.attr('name') === name) { + if (value) { + meta.attr('content', value); + } else { + meta.remove(); + } + return; + } + } + if (value) { + elm = new global$3('meta', 1); + elm.attr('name', name); + elm.attr('content', value); + elm.shortEnded = true; + addHeadNode(elm); + } + }); + var currentStyleSheetsMap = {}; + global$1.each(headerFragment.getAll('link'), function (stylesheet) { + if (stylesheet.attr('rel') === 'stylesheet') { + currentStyleSheetsMap[stylesheet.attr('href')] = stylesheet; + } + }); + global$1.each(data.stylesheets, function (stylesheet) { + if (!currentStyleSheetsMap[stylesheet]) { + elm = new global$3('link', 1); + elm.attr({ + rel: 'stylesheet', + text: 'text/css', + href: stylesheet + }); + elm.shortEnded = true; + addHeadNode(elm); + } + delete currentStyleSheetsMap[stylesheet]; + }); + global$1.each(currentStyleSheetsMap, function (stylesheet) { + stylesheet.remove(); + }); + elm = headerFragment.getAll('body')[0]; + if (elm) { + setAttr(elm, 'dir', data.langdir); + setAttr(elm, 'style', data.style); + setAttr(elm, 'vlink', data.visited_color); + setAttr(elm, 'link', data.link_color); + setAttr(elm, 'alink', data.active_color); + dom.setAttribs(editor.getBody(), { + style: data.style, + dir: data.dir, + vLink: data.visited_color, + link: data.link_color, + aLink: data.active_color + }); + } + elm = headerFragment.getAll('html')[0]; + if (elm) { + setAttr(elm, 'lang', data.langcode); + setAttr(elm, 'xml:lang', data.langcode); + } + if (!headElement.firstChild) { + headElement.remove(); + } + var html = global$4({ + validate: false, + indent: true, + indent_before: 'head,html,body,meta,title,script,link,style', + indent_after: 'head,html,body,meta,title,script,link,style' + }).serialize(headerFragment); + return html.substring(0, html.indexOf('')); + }; + + var open = function (editor, headState) { + var data = htmlToData(editor, headState.get()); + var defaultData = { + title: '', + keywords: '', + description: '', + robots: '', + author: '', + docencoding: '' + }; + var initialData = __assign(__assign({}, defaultData), data); + editor.windowManager.open({ + title: 'Metadata and Document Properties', + size: 'normal', + body: { + type: 'panel', + items: [ + { + name: 'title', + type: 'input', + label: 'Title' + }, + { + name: 'keywords', + type: 'input', + label: 'Keywords' + }, + { + name: 'description', + type: 'input', + label: 'Description' + }, + { + name: 'robots', + type: 'input', + label: 'Robots' + }, + { + name: 'author', + type: 'input', + label: 'Author' + }, + { + name: 'docencoding', + type: 'input', + label: 'Encoding' + } + ] + }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: initialData, + onSubmit: function (api) { + var nuData = api.getData(); + var headHtml = dataToHtml(editor, global$1.extend(data, nuData), headState.get()); + headState.set(headHtml); + api.close(); + } + }); + }; + + var register = function (editor, headState) { + editor.addCommand('mceFullPageProperties', function () { + open(editor, headState); + }); + }; + + var protectHtml = function (protect, html) { + global$1.each(protect, function (pattern) { + html = html.replace(pattern, function (str) { + return ''; + }); + }); + return html; + }; + var unprotectHtml = function (html) { + return html.replace(//g, function (a, m) { + return unescape(m); + }); + }; + + var each = global$1.each; + var low = function (s) { + return s.replace(/<\/?[A-Z]+/g, function (a) { + return a.toLowerCase(); + }); + }; + var handleSetContent = function (editor, headState, footState, evt) { + var startPos, endPos, content, styles = ''; + var dom = editor.dom; + if (evt.selection) { + return; + } + content = protectHtml(getProtect(editor), evt.content); + if (evt.format === 'raw' && headState.get()) { + return; + } + if (evt.source_view && shouldHideInSourceView(editor)) { + return; + } + if (content.length === 0 && !evt.source_view) { + content = global$1.trim(headState.get()) + '\n' + global$1.trim(content) + '\n' + global$1.trim(footState.get()); + } + content = content.replace(/<(\/?)BODY/gi, '<$1body'); + startPos = content.indexOf('', startPos); + headState.set(low(content.substring(0, startPos + 1))); + endPos = content.indexOf('\n'); + } + var headerFragment = parseHeader(headState.get()); + each(headerFragment.getAll('style'), function (node) { + if (node.firstChild) { + styles += node.firstChild.value; + } + }); + var bodyElm = headerFragment.getAll('body')[0]; + if (bodyElm) { + dom.setAttribs(editor.getBody(), { + style: bodyElm.attr('style') || '', + dir: bodyElm.attr('dir') || '', + vLink: bodyElm.attr('vlink') || '', + link: bodyElm.attr('link') || '', + aLink: bodyElm.attr('alink') || '' + }); + } + dom.remove('fullpage_styles'); + var headElm = editor.getDoc().getElementsByTagName('head')[0]; + if (styles) { + var styleElm = dom.add(headElm, 'style', { id: 'fullpage_styles' }); + styleElm.appendChild(document.createTextNode(styles)); + } + var currentStyleSheetsMap = {}; + global$1.each(headElm.getElementsByTagName('link'), function (stylesheet) { + if (stylesheet.rel === 'stylesheet' && stylesheet.getAttribute('data-mce-fullpage')) { + currentStyleSheetsMap[stylesheet.href] = stylesheet; + } + }); + global$1.each(headerFragment.getAll('link'), function (stylesheet) { + var href = stylesheet.attr('href'); + if (!href) { + return true; + } + if (!currentStyleSheetsMap[href] && stylesheet.attr('rel') === 'stylesheet') { + dom.add(headElm, 'link', { + 'rel': 'stylesheet', + 'text': 'text/css', + href: href, + 'data-mce-fullpage': '1' + }); + } + delete currentStyleSheetsMap[href]; + }); + global$1.each(currentStyleSheetsMap, function (stylesheet) { + stylesheet.parentNode.removeChild(stylesheet); + }); + }; + var getDefaultHeader = function (editor) { + var header = '', value, styles = ''; + if (getDefaultXmlPi(editor)) { + var piEncoding = getDefaultEncoding(editor); + header += '\n'; + } + header += getDefaultDocType(editor); + header += '\n\n\n'; + if (value = getDefaultTitle(editor)) { + header += '' + value + '\n'; + } + if (value = getDefaultEncoding(editor)) { + header += '\n'; + } + if (value = getDefaultFontFamily(editor)) { + styles += 'font-family: ' + value + ';'; + } + if (value = getDefaultFontSize(editor)) { + styles += 'font-size: ' + value + ';'; + } + if (value = getDefaultTextColor(editor)) { + styles += 'color: ' + value + ';'; + } + header += '\n\n'; + return header; + }; + var handleGetContent = function (editor, head, foot, evt) { + if (evt.format === 'html' && !evt.selection && (!evt.source_view || !shouldHideInSourceView(editor))) { + evt.content = unprotectHtml(global$1.trim(head) + '\n' + global$1.trim(evt.content) + '\n' + global$1.trim(foot)); + } + }; + var setup = function (editor, headState, footState) { + editor.on('BeforeSetContent', function (evt) { + handleSetContent(editor, headState, footState, evt); + }); + editor.on('GetContent', function (evt) { + handleGetContent(editor, headState.get(), footState.get(), evt); + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('fullpage', { + tooltip: 'Metadata and document properties', + icon: 'document-properties', + onAction: function () { + editor.execCommand('mceFullPageProperties'); + } + }); + editor.ui.registry.addMenuItem('fullpage', { + text: 'Metadata and document properties', + icon: 'document-properties', + onAction: function () { + editor.execCommand('mceFullPageProperties'); + } + }); + }; + + function Plugin () { + global.add('fullpage', function (editor) { + var headState = Cell(''), footState = Cell(''); + register(editor, headState); + register$1(editor); + setup(editor, headState, footState); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/fullpage/plugin.min.js b/src/assets/tinymce/plugins/fullpage/plugin.min.js new file mode 100644 index 00000000..2592f73c --- /dev/null +++ b/src/assets/tinymce/plugins/fullpage/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var s=function(e){var t=e;return{get:function(){return t},set:function(e){t=e}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=function(){return(u=Object.assign||function(e){for(var t,n=1,l=arguments.length;n"),(n=r.getAll("title")[0])&&n.firstChild&&(a.title=n.firstChild.value),p.each(r.getAll("meta"),function(e){var t,n=e.attr("name"),l=e.attr("http-equiv");n?a[n.toLowerCase()]=e.attr("content"):"Content-Type"===l&&(t=/charset\s*=\s*(.*)\s*/gi.exec(e.attr("content")))&&(a.docencoding=t[1])}),(n=r.getAll("html")[0])&&(a.langcode=s(n,"lang")||s(n,"xml:lang")),a.stylesheets=[],p.each(r.getAll("link"),function(e){"stylesheet"===e.attr("rel")&&a.stylesheets.push(e.attr("href"))}),(n=r.getAll("body")[0])&&(a.langdir=s(n,"dir"),a.style=s(n,"style"),a.visited_color=s(n,"vlink"),a.link_color=s(n,"link"),a.active_color=s(n,"alink")),a);function s(e,t){return e.attr(t)||""}var d=u(u({},{title:"",keywords:"",description:"",robots:"",author:"",docencoding:""}),c);l.windowManager.open({title:"Metadata and Document Properties",size:"normal",body:{type:"panel",items:[{name:"title",type:"input",label:"Title"},{name:"keywords",type:"input",label:"Keywords"},{name:"description",type:"input",label:"Description"},{name:"robots",type:"input",label:"Robots"},{name:"author",type:"input",label:"Author"},{name:"docencoding",type:"input",label:"Encoding"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:d,onSubmit:function(e){var t=e.getData(),n=function(e,o,t){var r,n,l=e.dom;function i(e,t,n){e.attr(t,n||undefined)}function a(e){c.firstChild?c.insert(e,c.firstChild):c.append(e)}var c,s=v(t);(c=s.getAll("head")[0])||(r=s.getAll("html")[0],c=new m("head",1),r.firstChild?r.insert(c,r.firstChild,!0):r.append(c)),r=s.firstChild,o.xml_pi?(n='version="1.0"',o.docencoding&&(n+=' encoding="'+o.docencoding+'"'),7!==r.type&&(r=new m("xml",7),s.insert(r,s.firstChild,!0)),r.value=n):r&&7===r.type&&r.remove(),r=s.getAll("#doctype")[0],o.doctype?(r||(r=new m("#doctype",10),o.xml_pi?s.insert(r,s.firstChild):a(r)),r.value=o.doctype.substring(9,o.doctype.length-1)):r&&r.remove(),r=null,p.each(s.getAll("meta"),function(e){"Content-Type"===e.attr("http-equiv")&&(r=e)}),o.docencoding?(r||((r=new m("meta",1)).attr("http-equiv","Content-Type"),r.shortEnded=!0,a(r)),r.attr("content","text/html; charset="+o.docencoding)):r&&r.remove(),r=s.getAll("title")[0],o.title?(r?r.empty():a(r=new m("title",1)),r.append(new m("#text",3)).value=o.title):r&&r.remove(),p.each("keywords,description,author,copyright,robots".split(","),function(e){for(var t,n=s.getAll("meta"),l=o[e],i=0;i"))}(l,p.extend(c,t),i.get());i.set(n),e.close()}})},_=p.each,b=function(e){return e.replace(/<\/?[A-Z]+/g,function(e){return e.toLowerCase()})},x=function(e,t,n,l){var i,o,r,a,c,s,d,u,m,f="",g=e.dom;l.selection||(a=e.getParam("protect"),c=l.content,p.each(a,function(e){c=c.replace(e,function(e){return"\x3c!--mce:protected "+escape(e)+"--\x3e"})}),r=c,"raw"===l.format&&t.get()||l.source_view&&h(e)||(0!==r.length||l.source_view||(r=p.trim(t.get())+"\n"+p.trim(r)+"\n"+p.trim(n.get())),-1!==(i=(r=r.replace(/<(\/?)BODY/gi,"<$1body")).indexOf("",i),t.set(b(r.substring(0,i+1))),-1===(o=r.indexOf("\n")),s=v(t.get()),_(s.getAll("style"),function(e){e.firstChild&&(f+=e.firstChild.value)}),(d=s.getAll("body")[0])&&g.setAttribs(e.getBody(),{style:d.attr("style")||"",dir:d.attr("dir")||"",vLink:d.attr("vlink")||"",link:d.attr("link")||"",aLink:d.attr("alink")||""}),g.remove("fullpage_styles"),u=e.getDoc().getElementsByTagName("head")[0],f&&g.add(u,"style",{id:"fullpage_styles"}).appendChild(document.createTextNode(f)),m={},p.each(u.getElementsByTagName("link"),function(e){"stylesheet"===e.rel&&e.getAttribute("data-mce-fullpage")&&(m[e.href]=e)}),p.each(s.getAll("link"),function(e){var t=e.attr("href");if(!t)return!0;m[t]||"stylesheet"!==e.attr("rel")||g.add(u,"link",{rel:"stylesheet",text:"text/css",href:t,"data-mce-fullpage":"1"}),delete m[t]}),p.each(m,function(e){e.parentNode.removeChild(e)})))},k=function(e){var t,n="",l="";return e.getParam("fullpage_default_xml_pi")&&(n+='\n'),n+=e.getParam("fullpage_default_doctype",""),n+="\n\n\n",(t=e.getParam("fullpage_default_title"))&&(n+=""+t+"\n"),(t=i(e))&&(n+='\n'),(t=g(e))&&(l+="font-family: "+t+";"),(t=y(e))&&(l+="font-size: "+t+";"),(t=e.getParam("fullpage_default_text_color"))&&(l+="color: "+t+";"),n+="\n\n"},C=function(e,t,n,l){"html"!==l.format||l.selection||l.source_view&&h(e)||(l.content=(p.trim(t)+"\n"+p.trim(l.content)+"\n"+p.trim(n)).replace(//g,function(e,t){return unescape(t)}))};e.add("fullpage",function(e){var t,n,l,i,o,r,a=s(""),c=s("");n=a,(t=e).addCommand("mceFullPageProperties",function(){d(t,n)}),(l=e).ui.registry.addButton("fullpage",{tooltip:"Metadata and document properties",icon:"document-properties",onAction:function(){l.execCommand("mceFullPageProperties")}}),l.ui.registry.addMenuItem("fullpage",{text:"Metadata and document properties",icon:"document-properties",onAction:function(){l.execCommand("mceFullPageProperties")}}),o=a,r=c,(i=e).on("BeforeSetContent",function(e){x(i,o,r,e)}),i.on("GetContent",function(e){C(i,o.get(),r.get(),e)})})}(); \ No newline at end of file diff --git a/src/assets/tinymce/plugins/fullscreen/plugin.js b/src/assets/tinymce/plugins/fullscreen/plugin.js new file mode 100644 index 00000000..deb9dde6 --- /dev/null +++ b/src/assets/tinymce/plugins/fullscreen/plugin.js @@ -0,0 +1,979 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var get = function (fullscreenState) { + return { + isFullscreen: function () { + return fullscreenState.get() !== null; + } + }; + }; + + var noop = function () { + }; + var compose = function (fa, fb) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return fa(fb.apply(null, args)); + }; + }; + var compose1 = function (fbc, fab) { + return function (a) { + return fbc(fab(a)); + }; + }; + var constant = function (value) { + return function () { + return value; + }; + }; + function curry(fn) { + var initialArgs = []; + for (var _i = 1; _i < arguments.length; _i++) { + initialArgs[_i - 1] = arguments[_i]; + } + return function () { + var restArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + restArgs[_i] = arguments[_i]; + } + var all = initialArgs.concat(restArgs); + return fn.apply(null, all); + }; + } + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Optional = { + some: some, + none: none, + from: from + }; + + var revocable = function (doRevoke) { + var subject = Cell(Optional.none()); + var revoke = function () { + return subject.get().each(doRevoke); + }; + var clear = function () { + revoke(); + subject.set(Optional.none()); + }; + var isSet = function () { + return subject.get().isSome(); + }; + var set = function (s) { + revoke(); + subject.set(Optional.some(s)); + }; + return { + clear: clear, + isSet: isSet, + set: set + }; + }; + var unbindable = function () { + return revocable(function (s) { + return s.unbind(); + }); + }; + var value = function () { + var subject = Cell(Optional.none()); + var clear = function () { + return subject.set(Optional.none()); + }; + var set = function (s) { + return subject.set(Optional.some(s)); + }; + var isSet = function () { + return subject.get().isSome(); + }; + var on = function (f) { + return subject.get().each(f); + }; + return { + clear: clear, + set: set, + isSet: isSet, + on: on + }; + }; + + var typeOf = function (x) { + var t = typeof x; + if (x === null) { + return 'null'; + } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } else { + return t; + } + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isSimpleType = function (type) { + return function (value) { + return typeof value === type; + }; + }; + var isString = isType('string'); + var isArray = isType('array'); + var isBoolean = isSimpleType('boolean'); + var isNullable = function (a) { + return a === null || a === undefined; + }; + var isNonNullable = function (a) { + return !isNullable(a); + }; + var isFunction = isSimpleType('function'); + var isNumber = isSimpleType('number'); + + var nativePush = Array.prototype.push; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var filter = function (xs, pred) { + var r = []; + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + r.push(x); + } + } + return r; + }; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var bind = function (xs, f) { + return flatten(map(xs, f)); + }; + var get$1 = function (xs, i) { + return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); + }; + var head = function (xs) { + return get$1(xs, 0); + }; + + var keys = Object.keys; + var each$1 = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + + var isSupported = function (dom) { + return dom.style !== undefined && isFunction(dom.style.getPropertyValue); + }; + + var fromHtml = function (html, scope) { + var doc = scope || document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: node }; + }; + var fromPoint = function (docElm, x, y) { + return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); + }; + var SugarElement = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var Global = typeof window !== 'undefined' ? window : Function('return this;')(); + + var DOCUMENT = 9; + var DOCUMENT_FRAGMENT = 11; + var ELEMENT = 1; + var TEXT = 3; + + var type = function (element) { + return element.dom.nodeType; + }; + var isType$1 = function (t) { + return function (element) { + return type(element) === t; + }; + }; + var isElement = isType$1(ELEMENT); + var isText = isType$1(TEXT); + var isDocument = isType$1(DOCUMENT); + var isDocumentFragment = isType$1(DOCUMENT_FRAGMENT); + + var is = function (element, selector) { + var dom = element.dom; + if (dom.nodeType !== ELEMENT) { + return false; + } else { + var elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } + }; + var bypassSelector = function (dom) { + return dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0; + }; + var all = function (selector, scope) { + var base = scope === undefined ? document : scope.dom; + return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), SugarElement.fromDom); + }; + + var eq = function (e1, e2) { + return e1.dom === e2.dom; + }; + + var owner = function (element) { + return SugarElement.fromDom(element.dom.ownerDocument); + }; + var documentOrOwner = function (dos) { + return isDocument(dos) ? dos : owner(dos); + }; + var parent = function (element) { + return Optional.from(element.dom.parentNode).map(SugarElement.fromDom); + }; + var parents = function (element, isRoot) { + var stop = isFunction(isRoot) ? isRoot : never; + var dom = element.dom; + var ret = []; + while (dom.parentNode !== null && dom.parentNode !== undefined) { + var rawParent = dom.parentNode; + var p = SugarElement.fromDom(rawParent); + ret.push(p); + if (stop(p) === true) { + break; + } else { + dom = rawParent; + } + } + return ret; + }; + var siblings = function (element) { + var filterSelf = function (elements) { + return filter(elements, function (x) { + return !eq(element, x); + }); + }; + return parent(element).map(children).map(filterSelf).getOr([]); + }; + var children = function (element) { + return map(element.dom.childNodes, SugarElement.fromDom); + }; + + var isShadowRoot = function (dos) { + return isDocumentFragment(dos); + }; + var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode); + var isSupported$1 = constant(supported); + var getRootNode = supported ? function (e) { + return SugarElement.fromDom(e.dom.getRootNode()); + } : documentOrOwner; + var getShadowRoot = function (e) { + var r = getRootNode(e); + return isShadowRoot(r) ? Optional.some(r) : Optional.none(); + }; + var getShadowHost = function (e) { + return SugarElement.fromDom(e.dom.host); + }; + var getOriginalEventTarget = function (event) { + if (isSupported$1() && isNonNullable(event.target)) { + var el = SugarElement.fromDom(event.target); + if (isElement(el) && isOpenShadowHost(el)) { + if (event.composed && event.composedPath) { + var composedPath = event.composedPath(); + if (composedPath) { + return head(composedPath); + } + } + } + } + return Optional.from(event.target); + }; + var isOpenShadowHost = function (element) { + return isNonNullable(element.dom.shadowRoot); + }; + + var inBody = function (element) { + var dom = isText(element) ? element.dom.parentNode : element.dom; + if (dom === undefined || dom === null || dom.ownerDocument === null) { + return false; + } + var doc = dom.ownerDocument; + return getShadowRoot(SugarElement.fromDom(dom)).fold(function () { + return doc.body.contains(dom); + }, compose1(inBody, getShadowHost)); + }; + var getBody = function (doc) { + var b = doc.dom.body; + if (b === null || b === undefined) { + throw new Error('Body is not available yet'); + } + return SugarElement.fromDom(b); + }; + + var rawSet = function (dom, key, value) { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + var set = function (element, key, value) { + rawSet(element.dom, key, value); + }; + var get$2 = function (element, key) { + var v = element.dom.getAttribute(key); + return v === null ? undefined : v; + }; + var remove = function (element, key) { + element.dom.removeAttribute(key); + }; + + var internalSet = function (dom, property, value) { + if (!isString(value)) { + console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); + throw new Error('CSS value must be a string: ' + value); + } + if (isSupported(dom)) { + dom.style.setProperty(property, value); + } + }; + var setAll = function (element, css) { + var dom = element.dom; + each$1(css, function (v, k) { + internalSet(dom, k, v); + }); + }; + var get$3 = function (element, property) { + var dom = element.dom; + var styles = window.getComputedStyle(dom); + var r = styles.getPropertyValue(property); + return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; + }; + var getUnsafeProperty = function (dom, property) { + return isSupported(dom) ? dom.style.getPropertyValue(property) : ''; + }; + + var mkEvent = function (target, x, y, stop, prevent, kill, raw) { + return { + target: target, + x: x, + y: y, + stop: stop, + prevent: prevent, + kill: kill, + raw: raw + }; + }; + var fromRawEvent = function (rawEvent) { + var target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target)); + var stop = function () { + return rawEvent.stopPropagation(); + }; + var prevent = function () { + return rawEvent.preventDefault(); + }; + var kill = compose(prevent, stop); + return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent); + }; + var handle = function (filter, handler) { + return function (rawEvent) { + if (filter(rawEvent)) { + handler(fromRawEvent(rawEvent)); + } + }; + }; + var binder = function (element, event, filter, handler, useCapture) { + var wrapped = handle(filter, handler); + element.dom.addEventListener(event, wrapped, useCapture); + return { unbind: curry(unbind, element, event, wrapped, useCapture) }; + }; + var bind$1 = function (element, event, filter, handler) { + return binder(element, event, filter, handler, false); + }; + var unbind = function (element, event, handler, useCapture) { + element.dom.removeEventListener(event, handler, useCapture); + }; + + var filter$1 = always; + var bind$2 = function (element, event, handler) { + return bind$1(element, event, filter$1, handler); + }; + + var r = function (left, top) { + var translate = function (x, y) { + return r(left + x, top + y); + }; + return { + left: left, + top: top, + translate: translate + }; + }; + var SugarPosition = r; + + var get$4 = function (_DOC) { + var doc = _DOC !== undefined ? _DOC.dom : document; + var x = doc.body.scrollLeft || doc.documentElement.scrollLeft; + var y = doc.body.scrollTop || doc.documentElement.scrollTop; + return SugarPosition(x, y); + }; + + var get$5 = function (_win) { + var win = _win === undefined ? window : _win; + return Optional.from(win['visualViewport']); + }; + var bounds = function (x, y, width, height) { + return { + x: x, + y: y, + width: width, + height: height, + right: x + width, + bottom: y + height + }; + }; + var getBounds = function (_win) { + var win = _win === undefined ? window : _win; + var doc = win.document; + var scroll = get$4(SugarElement.fromDom(doc)); + return get$5(win).fold(function () { + var html = win.document.documentElement; + var width = html.clientWidth; + var height = html.clientHeight; + return bounds(scroll.left, scroll.top, width, height); + }, function (visualViewport) { + return bounds(Math.max(visualViewport.pageLeft, scroll.left), Math.max(visualViewport.pageTop, scroll.top), visualViewport.width, visualViewport.height); + }); + }; + var bind$3 = function (name, callback, _win) { + return get$5(_win).map(function (visualViewport) { + var handler = function (e) { + return callback(fromRawEvent(e)); + }; + visualViewport.addEventListener(name, handler); + return { + unbind: function () { + return visualViewport.removeEventListener(name, handler); + } + }; + }).getOrThunk(function () { + return { unbind: noop }; + }); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.Env'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var fireFullscreenStateChanged = function (editor, state) { + editor.fire('FullscreenStateChanged', { state: state }); + }; + + var getFullscreenNative = function (editor) { + return editor.getParam('fullscreen_native', false, 'boolean'); + }; + + var getFullscreenRoot = function (editor) { + var elem = SugarElement.fromDom(editor.getElement()); + return getShadowRoot(elem).map(getShadowHost).getOrThunk(function () { + return getBody(owner(elem)); + }); + }; + var getFullscreenElement = function (root) { + if (root.fullscreenElement !== undefined) { + return root.fullscreenElement; + } else if (root.msFullscreenElement !== undefined) { + return root.msFullscreenElement; + } else if (root.webkitFullscreenElement !== undefined) { + return root.webkitFullscreenElement; + } else { + return null; + } + }; + var getFullscreenchangeEventName = function () { + if (document.fullscreenElement !== undefined) { + return 'fullscreenchange'; + } else if (document.msFullscreenElement !== undefined) { + return 'MSFullscreenChange'; + } else if (document.webkitFullscreenElement !== undefined) { + return 'webkitfullscreenchange'; + } else { + return 'fullscreenchange'; + } + }; + var requestFullscreen = function (sugarElem) { + var elem = sugarElem.dom; + if (elem.requestFullscreen) { + elem.requestFullscreen(); + } else if (elem.msRequestFullscreen) { + elem.msRequestFullscreen(); + } else if (elem.webkitRequestFullScreen) { + elem.webkitRequestFullScreen(); + } + }; + var exitFullscreen = function (sugarDoc) { + var doc = sugarDoc.dom; + if (doc.exitFullscreen) { + doc.exitFullscreen(); + } else if (doc.msExitFullscreen) { + doc.msExitFullscreen(); + } else if (doc.webkitCancelFullScreen) { + doc.webkitCancelFullScreen(); + } + }; + var isFullscreenElement = function (elem) { + return elem.dom === getFullscreenElement(owner(elem).dom); + }; + + var ancestors = function (scope, predicate, isRoot) { + return filter(parents(scope, isRoot), predicate); + }; + var siblings$1 = function (scope, predicate) { + return filter(siblings(scope), predicate); + }; + + var all$1 = function (selector) { + return all(selector); + }; + var ancestors$1 = function (scope, selector, isRoot) { + return ancestors(scope, function (e) { + return is(e, selector); + }, isRoot); + }; + var siblings$2 = function (scope, selector) { + return siblings$1(scope, function (e) { + return is(e, selector); + }); + }; + + var attr = 'data-ephox-mobile-fullscreen-style'; + var siblingStyles = 'display:none!important;'; + var ancestorPosition = 'position:absolute!important;'; + var ancestorStyles = 'top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;'; + var bgFallback = 'background-color:rgb(255,255,255)!important;'; + var isAndroid = global$2.os.isAndroid(); + var matchColor = function (editorBody) { + var color = get$3(editorBody, 'background-color'); + return color !== undefined && color !== '' ? 'background-color:' + color + '!important' : bgFallback; + }; + var clobberStyles = function (dom, container, editorBody) { + var gatherSiblings = function (element) { + return siblings$2(element, '*:not(.tox-silver-sink)'); + }; + var clobber = function (clobberStyle) { + return function (element) { + var styles = get$2(element, 'style'); + var backup = styles === undefined ? 'no-styles' : styles.trim(); + if (backup === clobberStyle) { + return; + } else { + set(element, attr, backup); + setAll(element, dom.parseStyle(clobberStyle)); + } + }; + }; + var ancestors = ancestors$1(container, '*'); + var siblings = bind(ancestors, gatherSiblings); + var bgColor = matchColor(editorBody); + each(siblings, clobber(siblingStyles)); + each(ancestors, clobber(ancestorPosition + ancestorStyles + bgColor)); + var containerStyles = isAndroid === true ? '' : ancestorPosition; + clobber(containerStyles + ancestorStyles + bgColor)(container); + }; + var restoreStyles = function (dom) { + var clobberedEls = all$1('[' + attr + ']'); + each(clobberedEls, function (element) { + var restore = get$2(element, attr); + if (restore !== 'no-styles') { + setAll(element, dom.parseStyle(restore)); + } else { + remove(element, 'style'); + } + remove(element, attr); + }); + }; + + var DOM = global$1.DOM; + var getScrollPos = function () { + var vp = getBounds(window); + return { + x: vp.x, + y: vp.y + }; + }; + var setScrollPos = function (pos) { + window.scrollTo(pos.x, pos.y); + }; + var viewportUpdate = get$5().fold(function () { + return { + bind: noop, + unbind: noop + }; + }, function (visualViewport) { + var editorContainer = value(); + var resizeBinder = unbindable(); + var scrollBinder = unbindable(); + var refreshScroll = function () { + document.body.scrollTop = 0; + document.documentElement.scrollTop = 0; + }; + var refreshVisualViewport = function () { + window.requestAnimationFrame(function () { + editorContainer.on(function (container) { + return setAll(container, { + top: visualViewport.offsetTop + 'px', + left: visualViewport.offsetLeft + 'px', + height: visualViewport.height + 'px', + width: visualViewport.width + 'px' + }); + }); + }); + }; + var update = global$3.throttle(function () { + refreshScroll(); + refreshVisualViewport(); + }, 50); + var bind = function (element) { + editorContainer.set(element); + update(); + resizeBinder.set(bind$3('resize', update)); + scrollBinder.set(bind$3('scroll', update)); + }; + var unbind = function () { + editorContainer.on(function () { + resizeBinder.clear(); + scrollBinder.clear(); + }); + editorContainer.clear(); + }; + return { + bind: bind, + unbind: unbind + }; + }); + var toggleFullscreen = function (editor, fullscreenState) { + var body = document.body; + var documentElement = document.documentElement; + var editorContainer = editor.getContainer(); + var editorContainerS = SugarElement.fromDom(editorContainer); + var fullscreenRoot = getFullscreenRoot(editor); + var fullscreenInfo = fullscreenState.get(); + var editorBody = SugarElement.fromDom(editor.getBody()); + var isTouch = global$2.deviceType.isTouch(); + var editorContainerStyle = editorContainer.style; + var iframe = editor.iframeElement; + var iframeStyle = iframe.style; + var handleClasses = function (handler) { + handler(body, 'tox-fullscreen'); + handler(documentElement, 'tox-fullscreen'); + handler(editorContainer, 'tox-fullscreen'); + getShadowRoot(editorContainerS).map(function (root) { + return getShadowHost(root).dom; + }).each(function (host) { + handler(host, 'tox-fullscreen'); + handler(host, 'tox-shadowhost'); + }); + }; + var cleanup = function () { + if (isTouch) { + restoreStyles(editor.dom); + } + handleClasses(DOM.removeClass); + viewportUpdate.unbind(); + Optional.from(fullscreenState.get()).each(function (info) { + return info.fullscreenChangeHandler.unbind(); + }); + }; + if (!fullscreenInfo) { + var fullscreenChangeHandler = bind$2(owner(fullscreenRoot), getFullscreenchangeEventName(), function (_evt) { + if (getFullscreenNative(editor)) { + if (!isFullscreenElement(fullscreenRoot) && fullscreenState.get() !== null) { + toggleFullscreen(editor, fullscreenState); + } + } + }); + var newFullScreenInfo = { + scrollPos: getScrollPos(), + containerWidth: editorContainerStyle.width, + containerHeight: editorContainerStyle.height, + containerTop: editorContainerStyle.top, + containerLeft: editorContainerStyle.left, + iframeWidth: iframeStyle.width, + iframeHeight: iframeStyle.height, + fullscreenChangeHandler: fullscreenChangeHandler + }; + if (isTouch) { + clobberStyles(editor.dom, editorContainerS, editorBody); + } + iframeStyle.width = iframeStyle.height = '100%'; + editorContainerStyle.width = editorContainerStyle.height = ''; + handleClasses(DOM.addClass); + viewportUpdate.bind(editorContainerS); + editor.on('remove', cleanup); + fullscreenState.set(newFullScreenInfo); + if (getFullscreenNative(editor)) { + requestFullscreen(fullscreenRoot); + } + fireFullscreenStateChanged(editor, true); + } else { + fullscreenInfo.fullscreenChangeHandler.unbind(); + if (getFullscreenNative(editor) && isFullscreenElement(fullscreenRoot)) { + exitFullscreen(owner(fullscreenRoot)); + } + iframeStyle.width = fullscreenInfo.iframeWidth; + iframeStyle.height = fullscreenInfo.iframeHeight; + editorContainerStyle.width = fullscreenInfo.containerWidth; + editorContainerStyle.height = fullscreenInfo.containerHeight; + editorContainerStyle.top = fullscreenInfo.containerTop; + editorContainerStyle.left = fullscreenInfo.containerLeft; + setScrollPos(fullscreenInfo.scrollPos); + fullscreenState.set(null); + fireFullscreenStateChanged(editor, false); + cleanup(); + editor.off('remove', cleanup); + } + }; + + var register = function (editor, fullscreenState) { + editor.addCommand('mceFullScreen', function () { + toggleFullscreen(editor, fullscreenState); + }); + }; + + var makeSetupHandler = function (editor, fullscreenState) { + return function (api) { + api.setActive(fullscreenState.get() !== null); + var editorEventCallback = function (e) { + return api.setActive(e.state); + }; + editor.on('FullscreenStateChanged', editorEventCallback); + return function () { + return editor.off('FullscreenStateChanged', editorEventCallback); + }; + }; + }; + var register$1 = function (editor, fullscreenState) { + editor.ui.registry.addToggleMenuItem('fullscreen', { + text: 'Fullscreen', + icon: 'fullscreen', + shortcut: 'Meta+Shift+F', + onAction: function () { + return editor.execCommand('mceFullScreen'); + }, + onSetup: makeSetupHandler(editor, fullscreenState) + }); + editor.ui.registry.addToggleButton('fullscreen', { + tooltip: 'Fullscreen', + icon: 'fullscreen', + onAction: function () { + return editor.execCommand('mceFullScreen'); + }, + onSetup: makeSetupHandler(editor, fullscreenState) + }); + }; + + function Plugin () { + global.add('fullscreen', function (editor) { + var fullscreenState = Cell(null); + if (editor.inline) { + return get(fullscreenState); + } + register(editor, fullscreenState); + register$1(editor, fullscreenState); + editor.addShortcut('Meta+Shift+F', '', 'mceFullScreen'); + return get(fullscreenState); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/fullscreen/plugin.min.js b/src/assets/tinymce/plugins/fullscreen/plugin.min.js new file mode 100644 index 00000000..7dee35d7 --- /dev/null +++ b/src/assets/tinymce/plugins/fullscreen/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var c=function(n){var e=n;return{get:function(){return e},set:function(n){e=n}}},n=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(n){return{isFullscreen:function(){return null!==n.get()}}},e=function(){},u=function(n){return function(){return n}};var t,r,o,l=u(!1),f=u(!0),a=function(){return d},d=(t=function(n){return n.isNone()},{fold:function(n,e){return n()},is:l,isSome:l,isNone:f,getOr:o=function(n){return n},getOrThunk:r=function(n){return n()},getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:u(null),getOrUndefined:u(undefined),or:o,orThunk:r,map:a,each:e,bind:a,exists:l,forall:f,filter:a,equals:t,equals_:t,toArray:function(){return[]},toString:u("none()")}),s=function(t){var n=u(t),e=function(){return o},r=function(n){return n(t)},o={fold:function(n,e){return e(t)},is:function(n){return t===n},isSome:f,isNone:l,getOr:n,getOrThunk:n,getOrDie:n,getOrNull:n,getOrUndefined:n,or:e,orThunk:e,map:function(n){return s(n(t))},each:function(n){n(t)},bind:r,exists:r,forall:r,filter:function(n){return n(t)?o:d},toArray:function(){return[t]},toString:function(){return"some("+t+")"},equals:function(n){return n.is(t)},equals_:function(n,e){return n.fold(l,function(n){return e(t,n)})}};return o},S={some:s,none:a,from:function(n){return null===n||n===undefined?d:s(n)}},m=function(){return n=function(n){return n.unbind()},e=c(S.none()),t=function(){return e.get().each(n)},{clear:function(){t(),e.set(S.none())},isSet:function(){return e.get().isSome()},set:function(n){t(),e.set(S.some(n))}};var n,e,t},h=function(r){return function(n){return t=typeof(e=n),(null===e?"null":"object"==t&&(Array.prototype.isPrototypeOf(e)||e.constructor&&"Array"===e.constructor.name)?"array":"object"==t&&(String.prototype.isPrototypeOf(e)||e.constructor&&"String"===e.constructor.name)?"string":t)===r;var e,t}},g=function(e){return function(n){return typeof n===e}},p=h("string"),v=h("array"),y=g("boolean"),w=function(n){return!(null===(e=n)||e===undefined);var e},b=g("function"),E=g("number"),F=Array.prototype.push,T=function(n,e){for(var t=n.length,r=new Array(t),o=0;o -1; + }; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var filter = function (xs, pred) { + var r = []; + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + r.push(x); + } + } + return r; + }; + var findUntil = function (xs, pred, until) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + return Optional.some(x); + } else if (until(x, i)) { + break; + } + } + return Optional.none(); + }; + var find = function (xs, pred) { + return findUntil(xs, pred, never); + }; + + var keys = Object.keys; + var hasOwnProperty = Object.hasOwnProperty; + var get$1 = function (obj, key) { + return has(obj, key) ? Optional.from(obj[key]) : Optional.none(); + }; + var has = function (obj, key) { + return hasOwnProperty.call(obj, key); + }; + + var cat = function (arr) { + var r = []; + var push = function (x) { + r.push(x); + }; + for (var i = 0; i < arr.length; i++) { + arr[i].each(push); + } + return r; + }; + + var getHelpTabs = function (editor) { + return Optional.from(editor.getParam('help_tabs')); + }; + var getForcedPlugins = function (editor) { + return editor.getParam('forced_plugins'); + }; + + var description = '

Editor UI keyboard navigation

\n\n

Activating keyboard navigation

\n\n

The sections of the outer UI of the editor - the menubar, toolbar, sidebar and footer - are all keyboard navigable. As such, there are multiple ways to activate keyboard navigation:

\n
    \n
  • Focus the menubar: Alt + F9 (Windows) or ⌥F9 (MacOS)
  • \n
  • Focus the toolbar: Alt + F10 (Windows) or ⌥F10 (MacOS)
  • \n
  • Focus the footer: Alt + F11 (Windows) or ⌥F11 (MacOS)
  • \n
\n\n

Focusing the menubar or toolbar will start keyboard navigation at the first item in the menubar or toolbar, which will be highlighted with a gray background. Focusing the footer will start keyboard navigation at the first item in the element path, which will be highlighted with an underline.

\n\n

Moving between UI sections

\n\n

When keyboard navigation is active, pressing tab will move the focus to the next major section of the UI, where applicable. These sections are:

\n
    \n
  • the menubar
  • \n
  • each group of the toolbar
  • \n
  • the sidebar
  • \n
  • the element path in the footer
  • \n
  • the wordcount toggle button in the footer
  • \n
  • the branding link in the footer
  • \n
\n\n

Pressing shift + tab will move backwards through the same sections, except when moving from the footer to the toolbar. Focusing the element path then pressing shift + tab will move focus to the first toolbar group, not the last.

\n\n

Moving within UI sections

\n\n

Keyboard navigation within UI sections can usually be achieved using the left and right arrow keys. This includes:

\n
    \n
  • moving between menus in the menubar
  • \n
  • moving between buttons in a toolbar group
  • \n
  • moving between items in the element path
  • \n
\n\n

In all these UI sections, keyboard navigation will cycle within the section. For example, focusing the last button in a toolbar group then pressing right arrow will move focus to the first item in the same toolbar group.

\n\n

Executing buttons

\n\n

To execute a button, navigate the selection to the desired button and hit space or enter.

\n\n

Opening, navigating and closing menus

\n\n

When focusing a menubar button or a toolbar button with a menu, pressing space, enter or down arrow will open the menu. When the menu opens the first item will be selected. To move up or down the menu, press the up or down arrow key respectively. This is the same for submenus, which can also be opened and closed using the left and right arrow keys.

\n\n

To close any active menu, hit the escape key. When a menu is closed the selection will be restored to its previous selection. This also works for closing submenus.

\n\n

Context toolbars and menus

\n\n

To focus an open context toolbar such as the table context toolbar, press Ctrl + F9 (Windows) or ⌃F9 (MacOS).

\n\n

Context toolbar navigation is the same as toolbar navigation, and context menu navigation is the same as standard menu navigation.

\n\n

Dialog navigation

\n\n

There are two types of dialog UIs in TinyMCE: tabbed dialogs and non-tabbed dialogs.

\n\n

When a non-tabbed dialog is opened, the first interactive component in the dialog will be focused. Users can navigate between interactive components by pressing tab. This includes any footer buttons. Navigation will cycle back to the first dialog component if tab is pressed while focusing the last component in the dialog. Pressing shift + tab will navigate backwards.

\n\n

When a tabbed dialog is opened, the first button in the tab menu is focused. Pressing tab will navigate to the first interactive component in that tab, and will cycle through the tab\u2019s components, the footer buttons, then back to the tab button. To switch to another tab, focus the tab button for the current tab, then use the arrow keys to cycle through the tab buttons.

'; + var tab = function () { + var body = { + type: 'htmlpanel', + presets: 'document', + html: description + }; + return { + name: 'keyboardnav', + title: 'Keyboard Navigation', + items: [body] + }; + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.Env'); + + var convertText = function (source) { + var mac = { + alt: '⌥', + ctrl: '⌃', + shift: '⇧', + meta: '⌘', + access: '⌃⌥' + }; + var other = { + meta: 'Ctrl ', + access: 'Shift + Alt ' + }; + var replace = global$1.mac ? mac : other; + var shortcut = source.split('+'); + var updated = map(shortcut, function (segment) { + var search = segment.toLowerCase().trim(); + return has(replace, search) ? replace[search] : segment; + }); + return global$1.mac ? updated.join('').replace(/\s/, '') : updated.join('+'); + }; + + var shortcuts = [ + { + shortcuts: ['Meta + B'], + action: 'Bold' + }, + { + shortcuts: ['Meta + I'], + action: 'Italic' + }, + { + shortcuts: ['Meta + U'], + action: 'Underline' + }, + { + shortcuts: ['Meta + A'], + action: 'Select all' + }, + { + shortcuts: [ + 'Meta + Y', + 'Meta + Shift + Z' + ], + action: 'Redo' + }, + { + shortcuts: ['Meta + Z'], + action: 'Undo' + }, + { + shortcuts: ['Access + 1'], + action: 'Heading 1' + }, + { + shortcuts: ['Access + 2'], + action: 'Heading 2' + }, + { + shortcuts: ['Access + 3'], + action: 'Heading 3' + }, + { + shortcuts: ['Access + 4'], + action: 'Heading 4' + }, + { + shortcuts: ['Access + 5'], + action: 'Heading 5' + }, + { + shortcuts: ['Access + 6'], + action: 'Heading 6' + }, + { + shortcuts: ['Access + 7'], + action: 'Paragraph' + }, + { + shortcuts: ['Access + 8'], + action: 'Div' + }, + { + shortcuts: ['Access + 9'], + action: 'Address' + }, + { + shortcuts: ['Alt + 0'], + action: 'Open help dialog' + }, + { + shortcuts: ['Alt + F9'], + action: 'Focus to menubar' + }, + { + shortcuts: ['Alt + F10'], + action: 'Focus to toolbar' + }, + { + shortcuts: ['Alt + F11'], + action: 'Focus to element path' + }, + { + shortcuts: ['Ctrl + F9'], + action: 'Focus to contextual toolbar' + }, + { + shortcuts: ['Shift + Enter'], + action: 'Open popup menu for split buttons' + }, + { + shortcuts: ['Meta + K'], + action: 'Insert link (if link plugin activated)' + }, + { + shortcuts: ['Meta + S'], + action: 'Save (if save plugin activated)' + }, + { + shortcuts: ['Meta + F'], + action: 'Find (if searchreplace plugin activated)' + }, + { + shortcuts: ['Meta + Shift + F'], + action: 'Switch to or from fullscreen modal' + } + ]; + + var tab$1 = function () { + var shortcutList = map(shortcuts, function (shortcut) { + var shortcutText = map(shortcut.shortcuts, convertText).join(' or '); + return [ + shortcut.action, + shortcutText + ]; + }); + var tablePanel = { + type: 'table', + header: [ + 'Action', + 'Shortcut' + ], + cells: shortcutList + }; + return { + name: 'shortcuts', + title: 'Handy Shortcuts', + items: [tablePanel] + }; + }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.I18n'); + + var urls = [ + { + key: 'advlist', + name: 'Advanced List' + }, + { + key: 'anchor', + name: 'Anchor' + }, + { + key: 'autolink', + name: 'Autolink' + }, + { + key: 'autoresize', + name: 'Autoresize' + }, + { + key: 'autosave', + name: 'Autosave' + }, + { + key: 'bbcode', + name: 'BBCode' + }, + { + key: 'charmap', + name: 'Character Map' + }, + { + key: 'code', + name: 'Code' + }, + { + key: 'codesample', + name: 'Code Sample' + }, + { + key: 'colorpicker', + name: 'Color Picker' + }, + { + key: 'directionality', + name: 'Directionality' + }, + { + key: 'emoticons', + name: 'Emoticons' + }, + { + key: 'fullpage', + name: 'Full Page' + }, + { + key: 'fullscreen', + name: 'Full Screen' + }, + { + key: 'help', + name: 'Help' + }, + { + key: 'hr', + name: 'Horizontal Rule' + }, + { + key: 'image', + name: 'Image' + }, + { + key: 'imagetools', + name: 'Image Tools' + }, + { + key: 'importcss', + name: 'Import CSS' + }, + { + key: 'insertdatetime', + name: 'Insert Date/Time' + }, + { + key: 'legacyoutput', + name: 'Legacy Output' + }, + { + key: 'link', + name: 'Link' + }, + { + key: 'lists', + name: 'Lists' + }, + { + key: 'media', + name: 'Media' + }, + { + key: 'nonbreaking', + name: 'Nonbreaking' + }, + { + key: 'noneditable', + name: 'Noneditable' + }, + { + key: 'pagebreak', + name: 'Page Break' + }, + { + key: 'paste', + name: 'Paste' + }, + { + key: 'preview', + name: 'Preview' + }, + { + key: 'print', + name: 'Print' + }, + { + key: 'save', + name: 'Save' + }, + { + key: 'searchreplace', + name: 'Search and Replace' + }, + { + key: 'spellchecker', + name: 'Spell Checker' + }, + { + key: 'tabfocus', + name: 'Tab Focus' + }, + { + key: 'table', + name: 'Table' + }, + { + key: 'template', + name: 'Template' + }, + { + key: 'textcolor', + name: 'Text Color' + }, + { + key: 'textpattern', + name: 'Text Pattern' + }, + { + key: 'toc', + name: 'Table of Contents' + }, + { + key: 'visualblocks', + name: 'Visual Blocks' + }, + { + key: 'visualchars', + name: 'Visual Characters' + }, + { + key: 'wordcount', + name: 'Word Count' + }, + { + key: 'advcode', + name: 'Advanced Code Editor*' + }, + { + key: 'formatpainter', + name: 'Format Painter*' + }, + { + key: 'powerpaste', + name: 'PowerPaste*' + }, + { + key: 'tinydrive', + name: 'Tiny Drive*', + slug: 'drive' + }, + { + key: 'tinymcespellchecker', + name: 'Spell Checker Pro*' + }, + { + key: 'a11ychecker', + name: 'Accessibility Checker*' + }, + { + key: 'linkchecker', + name: 'Link Checker*' + }, + { + key: 'mentions', + name: 'Mentions*' + }, + { + key: 'mediaembed', + name: 'Enhanced Media Embed*' + }, + { + key: 'checklist', + name: 'Checklist*' + }, + { + key: 'casechange', + name: 'Case Change*' + }, + { + key: 'permanentpen', + name: 'Permanent Pen*' + }, + { + key: 'pageembed', + name: 'Page Embed*' + }, + { + key: 'tinycomments', + name: 'Tiny Comments*', + slug: 'comments' + }, + { + key: 'advtable', + name: 'Advanced Tables*' + }, + { + key: 'autocorrect', + name: 'Autocorrect*' + } + ]; + + var tab$2 = function (editor) { + var availablePlugins = function () { + var premiumPlugins = [ + 'Accessibility Checker', + 'Advanced Code Editor', + 'Advanced Tables', + 'Case Change', + 'Checklist', + 'Tiny Comments', + 'Tiny Drive', + 'Enhanced Media Embed', + 'Format Painter', + 'Link Checker', + 'Mentions', + 'MoxieManager', + 'Page Embed', + 'Permanent Pen', + 'PowerPaste', + 'Spell Checker Pro' + ]; + var premiumPluginList = map(premiumPlugins, function (plugin) { + return '
  • ' + global$2.translate(plugin) + '
  • '; + }).join(''); + return '
    ' + '

    ' + global$2.translate('Premium plugins:') + '

    ' + '' + '
    '; + }; + var makeLink = function (p) { + return '' + p.name + ''; + }; + var maybeUrlize = function (editor, key) { + return find(urls, function (x) { + return x.key === key; + }).fold(function () { + var getMetadata = editor.plugins[key].getMetadata; + return typeof getMetadata === 'function' ? makeLink(getMetadata()) : key; + }, function (x) { + var urlSlug = x.slug || x.key; + return makeLink({ + name: x.name, + url: 'https://www.tiny.cloud/docs/plugins/' + urlSlug + }); + }); + }; + var getPluginKeys = function (editor) { + var keys$1 = keys(editor.plugins); + var forced_plugins = getForcedPlugins(editor); + return forced_plugins === undefined ? keys$1 : filter(keys$1, function (k) { + return !contains(forced_plugins, k); + }); + }; + var pluginLister = function (editor) { + var pluginKeys = getPluginKeys(editor); + var pluginLis = map(pluginKeys, function (key) { + return '
  • ' + maybeUrlize(editor, key) + '
  • '; + }); + var count = pluginLis.length; + var pluginsString = pluginLis.join(''); + var html = '

    ' + global$2.translate([ + 'Plugins installed ({0}):', + count + ]) + '

    ' + '
      ' + pluginsString + '
    '; + return html; + }; + var installedPlugins = function (editor) { + if (editor == null) { + return ''; + } + return '
    ' + pluginLister(editor) + '
    '; + }; + var htmlPanel = { + type: 'htmlpanel', + presets: 'document', + html: [ + installedPlugins(editor), + availablePlugins() + ].join('') + }; + return { + name: 'plugins', + title: 'Plugins', + items: [htmlPanel] + }; + }; + + var global$3 = tinymce.util.Tools.resolve('tinymce.EditorManager'); + + var tab$3 = function () { + var getVersion = function (major, minor) { + return major.indexOf('@') === 0 ? 'X.X.X' : major + '.' + minor; + }; + var version = getVersion(global$3.majorVersion, global$3.minorVersion); + var changeLogLink = 'TinyMCE ' + version + ''; + var htmlPanel = { + type: 'htmlpanel', + html: '

    ' + global$2.translate([ + 'You are using {0}', + changeLogLink + ]) + '

    ', + presets: 'document' + }; + return { + name: 'versions', + title: 'Version', + items: [htmlPanel] + }; + }; + + var parseHelpTabsSetting = function (tabsFromSettings, tabs) { + var newTabs = {}; + var names = map(tabsFromSettings, function (t) { + if (typeof t === 'string') { + if (has(tabs, t)) { + newTabs[t] = tabs[t]; + } + return t; + } else { + newTabs[t.name] = t; + return t.name; + } + }); + return { + tabs: newTabs, + names: names + }; + }; + var getNamesFromTabs = function (tabs) { + var names = keys(tabs); + var idx = names.indexOf('versions'); + if (idx !== -1) { + names.splice(idx, 1); + names.push('versions'); + } + return { + tabs: tabs, + names: names + }; + }; + var parseCustomTabs = function (editor, customTabs) { + var _a; + var shortcuts = tab$1(); + var nav = tab(); + var plugins = tab$2(editor); + var versions = tab$3(); + var tabs = __assign((_a = {}, _a[shortcuts.name] = shortcuts, _a[nav.name] = nav, _a[plugins.name] = plugins, _a[versions.name] = versions, _a), customTabs.get()); + return getHelpTabs(editor).fold(function () { + return getNamesFromTabs(tabs); + }, function (tabsFromSettings) { + return parseHelpTabsSetting(tabsFromSettings, tabs); + }); + }; + var init = function (editor, customTabs) { + return function () { + var _a = parseCustomTabs(editor, customTabs), tabs = _a.tabs, names = _a.names; + var foundTabs = map(names, function (name) { + return get$1(tabs, name); + }); + var dialogTabs = cat(foundTabs); + var body = { + type: 'tabpanel', + tabs: dialogTabs + }; + editor.windowManager.open({ + title: 'Help', + size: 'medium', + body: body, + buttons: [{ + type: 'cancel', + name: 'close', + text: 'Close', + primary: true + }], + initialData: {} + }); + }; + }; + + function Plugin () { + global.add('help', function (editor) { + var customTabs = Cell({}); + var api = get(customTabs); + var dialogOpener = init(editor, customTabs); + register$1(editor, dialogOpener); + register(editor, dialogOpener); + editor.shortcuts.add('Alt+0', 'Open help dialog', 'mceHelp'); + return api; + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/help/plugin.min.js b/src/assets/tinymce/plugins/help/plugin.min.js new file mode 100644 index 00000000..43f1379f --- /dev/null +++ b/src/assets/tinymce/plugins/help/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e,t,n,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),m=function(){return(m=Object.assign||function(e){for(var t,n=1,a=arguments.length;n'+e.name+""};return{name:"plugins",title:"Plugins",items:[{type:"htmlpanel",presets:"document",html:[null==(n=e)?"":'
    '+function(a){var e,t,n,o=(t=f((e=a).plugins),(n=e.getParam("forced_plugins"))===undefined?t:function(e,t){for(var n=[],a=0,o=e.length;a"+(t=a,n=e,g(C,function(e){return e.key===n}).fold(function(){var e=t.plugins[n].getMetadata;return"function"==typeof e?l(e()):n},function(e){var t=e.slug||e.key;return l({name:e.name,url:"https://www.tiny.cloud/docs/plugins/"+t})}))+"";var t,n}),r=i.length,s=i.join("");return"

    "+A.translate(["Plugins installed ({0}):",r])+"

      "+s+"
    "}(n)+"
    ",(t=p(["Accessibility Checker","Advanced Code Editor","Advanced Tables","Case Change","Checklist","Tiny Comments","Tiny Drive","Enhanced Media Embed","Format Painter","Link Checker","Mentions","MoxieManager","Page Embed","Permanent Pen","PowerPaste","Spell Checker Pro"],function(e){return"
  • "+A.translate(e)+"
  • "}).join(""),'

    '+A.translate("Premium plugins:")+"

    ")].join("")}]}},x=tinymce.util.Tools.resolve("tinymce.EditorManager"),P=function(e,t){var n,a,o,i,r,s={name:"shortcuts",title:"Handy Shortcuts",items:[{type:"table",header:["Action","Shortcut"],cells:p(w,function(e){var t=p(e.shortcuts,v).join(" or ");return[e.action,t]})}]},l={name:"keyboardnav",title:"Keyboard Navigation",items:[{type:"htmlpanel",presets:"document",html:"

    Editor UI keyboard navigation

    \n\n

    Activating keyboard navigation

    \n\n

    The sections of the outer UI of the editor - the menubar, toolbar, sidebar and footer - are all keyboard navigable. As such, there are multiple ways to activate keyboard navigation:

    \n
      \n
    • Focus the menubar: Alt + F9 (Windows) or ⌥F9 (MacOS)
    • \n
    • Focus the toolbar: Alt + F10 (Windows) or ⌥F10 (MacOS)
    • \n
    • Focus the footer: Alt + F11 (Windows) or ⌥F11 (MacOS)
    • \n
    \n\n

    Focusing the menubar or toolbar will start keyboard navigation at the first item in the menubar or toolbar, which will be highlighted with a gray background. Focusing the footer will start keyboard navigation at the first item in the element path, which will be highlighted with an underline.

    \n\n

    Moving between UI sections

    \n\n

    When keyboard navigation is active, pressing tab will move the focus to the next major section of the UI, where applicable. These sections are:

    \n
      \n
    • the menubar
    • \n
    • each group of the toolbar
    • \n
    • the sidebar
    • \n
    • the element path in the footer
    • \n
    • the wordcount toggle button in the footer
    • \n
    • the branding link in the footer
    • \n
    \n\n

    Pressing shift + tab will move backwards through the same sections, except when moving from the footer to the toolbar. Focusing the element path then pressing shift + tab will move focus to the first toolbar group, not the last.

    \n\n

    Moving within UI sections

    \n\n

    Keyboard navigation within UI sections can usually be achieved using the left and right arrow keys. This includes:

    \n
      \n
    • moving between menus in the menubar
    • \n
    • moving between buttons in a toolbar group
    • \n
    • moving between items in the element path
    • \n
    \n\n

    In all these UI sections, keyboard navigation will cycle within the section. For example, focusing the last button in a toolbar group then pressing right arrow will move focus to the first item in the same toolbar group.

    \n\n

    Executing buttons

    \n\n

    To execute a button, navigate the selection to the desired button and hit space or enter.

    \n\n

    Opening, navigating and closing menus

    \n\n

    When focusing a menubar button or a toolbar button with a menu, pressing space, enter or down arrow will open the menu. When the menu opens the first item will be selected. To move up or down the menu, press the up or down arrow key respectively. This is the same for submenus, which can also be opened and closed using the left and right arrow keys.

    \n\n

    To close any active menu, hit the escape key. When a menu is closed the selection will be restored to its previous selection. This also works for closing submenus.

    \n\n

    Context toolbars and menus

    \n\n

    To focus an open context toolbar such as the table context toolbar, press Ctrl + F9 (Windows) or ⌃F9 (MacOS).

    \n\n

    Context toolbar navigation is the same as toolbar navigation, and context menu navigation is the same as standard menu navigation.

    \n\n

    Dialog navigation

    \n\n

    There are two types of dialog UIs in TinyMCE: tabbed dialogs and non-tabbed dialogs.

    \n\n

    When a non-tabbed dialog is opened, the first interactive component in the dialog will be focused. Users can navigate between interactive components by pressing tab. This includes any footer buttons. Navigation will cycle back to the first dialog component if tab is pressed while focusing the last component in the dialog. Pressing shift + tab will navigate backwards.

    \n\n

    When a tabbed dialog is opened, the first button in the tab menu is focused. Pressing tab will navigate to the first interactive component in that tab, and will cycle through the tab\u2019s components, the footer buttons, then back to the tab button. To switch to another tab, focus the tab button for the current tab, then use the arrow keys to cycle through the tab buttons.

    "}]},c=T(e),u=(i='TinyMCE '+(a=x.majorVersion,o=x.minorVersion,0===a.indexOf("@")?"X.X.X":a+"."+o)+"",{name:"versions",title:"Version",items:[{type:"htmlpanel",html:"

    "+A.translate(["You are using {0}",i])+"

    ",presets:"document"}]}),h=m(((n={})[s.name]=s,n[l.name]=l,n[c.name]=c,n[u.name]=u,n),t.get());return r=e,d.from(r.getParam("help_tabs")).fold(function(){return t=f(e=h),-1!==(n=t.indexOf("versions"))&&(t.splice(n,1),t.push("versions")),{tabs:e,names:t};var e,t,n},function(e){return t=h,n={},a=p(e,function(e){return"string"==typeof e?(y(t,e)&&(n[e]=t[e]),e):(n[e.name]=e).name}),{tabs:n,names:a};var t,n,a})},M=function(o,i){return function(){var e=P(o,i),a=e.tabs,t=e.names,n={type:"tabpanel",tabs:function(e){for(var t=[],n=function(e){t.push(e)},a=0;a'); + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('hr', { + icon: 'horizontal-rule', + tooltip: 'Horizontal line', + onAction: function () { + return editor.execCommand('InsertHorizontalRule'); + } + }); + editor.ui.registry.addMenuItem('hr', { + icon: 'horizontal-rule', + text: 'Horizontal line', + onAction: function () { + return editor.execCommand('InsertHorizontalRule'); + } + }); + }; + + function Plugin () { + global.add('hr', function (editor) { + register(editor); + register$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/hr/plugin.min.js b/src/assets/tinymce/plugins/hr/plugin.min.js new file mode 100644 index 00000000..dfeca9e0 --- /dev/null +++ b/src/assets/tinymce/plugins/hr/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager");n.add("hr",function(n){var o,t;(o=n).addCommand("InsertHorizontalRule",function(){o.execCommand("mceInsertContent",!1,"
    ")}),(t=n).ui.registry.addButton("hr",{icon:"horizontal-rule",tooltip:"Horizontal line",onAction:function(){return t.execCommand("InsertHorizontalRule")}}),t.ui.registry.addMenuItem("hr",{icon:"horizontal-rule",text:"Horizontal line",onAction:function(){return t.execCommand("InsertHorizontalRule")}})})}(); \ No newline at end of file diff --git a/src/assets/tinymce/plugins/image/plugin.js b/src/assets/tinymce/plugins/image/plugin.js new file mode 100644 index 00000000..d7b1cf18 --- /dev/null +++ b/src/assets/tinymce/plugins/image/plugin.js @@ -0,0 +1,1664 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var typeOf = function (x) { + var t = typeof x; + if (x === null) { + return 'null'; + } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } else { + return t; + } + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isSimpleType = function (type) { + return function (value) { + return typeof value === type; + }; + }; + var eq = function (t) { + return function (a) { + return t === a; + }; + }; + var isString = isType('string'); + var isObject = isType('object'); + var isArray = isType('array'); + var isNull = eq(null); + var isBoolean = isSimpleType('boolean'); + var isNumber = isSimpleType('number'); + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Optional = { + some: some, + none: none, + from: from + }; + + var nativePush = Array.prototype.push; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var get = function (xs, i) { + return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); + }; + var head = function (xs) { + return get(xs, 0); + }; + var findMap = function (arr, f) { + for (var i = 0; i < arr.length; i++) { + var r = f(arr[i], i); + if (r.isSome()) { + return r; + } + } + return Optional.none(); + }; + + var Global = typeof window !== 'undefined' ? window : Function('return this;')(); + + var rawSet = function (dom, key, value) { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + var set = function (element, key, value) { + rawSet(element.dom, key, value); + }; + var remove = function (element, key) { + element.dom.removeAttribute(key); + }; + + var fromHtml = function (html, scope) { + var doc = scope || document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: node }; + }; + var fromPoint = function (docElm, x, y) { + return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); + }; + var SugarElement = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.XHR'); + + var hasDimensions = function (editor) { + return editor.getParam('image_dimensions', true, 'boolean'); + }; + var hasAdvTab = function (editor) { + return editor.getParam('image_advtab', false, 'boolean'); + }; + var hasUploadTab = function (editor) { + return editor.getParam('image_uploadtab', true, 'boolean'); + }; + var getPrependUrl = function (editor) { + return editor.getParam('image_prepend_url', '', 'string'); + }; + var getClassList = function (editor) { + return editor.getParam('image_class_list'); + }; + var hasDescription = function (editor) { + return editor.getParam('image_description', true, 'boolean'); + }; + var hasImageTitle = function (editor) { + return editor.getParam('image_title', false, 'boolean'); + }; + var hasImageCaption = function (editor) { + return editor.getParam('image_caption', false, 'boolean'); + }; + var getImageList = function (editor) { + return editor.getParam('image_list', false); + }; + var hasUploadUrl = function (editor) { + return !!getUploadUrl(editor); + }; + var hasUploadHandler = function (editor) { + return !!getUploadHandler(editor); + }; + var getUploadUrl = function (editor) { + return editor.getParam('images_upload_url', '', 'string'); + }; + var getUploadHandler = function (editor) { + return editor.getParam('images_upload_handler', undefined, 'function'); + }; + var getUploadBasePath = function (editor) { + return editor.getParam('images_upload_base_path', undefined, 'string'); + }; + var getUploadCredentials = function (editor) { + return editor.getParam('images_upload_credentials', false, 'boolean'); + }; + var showAccessibilityOptions = function (editor) { + return editor.getParam('a11y_advanced_options', false, 'boolean'); + }; + var isAutomaticUploadsEnabled = function (editor) { + return editor.getParam('automatic_uploads', true, 'boolean'); + }; + + var parseIntAndGetMax = function (val1, val2) { + return Math.max(parseInt(val1, 10), parseInt(val2, 10)); + }; + var getImageSize = function (url) { + return new global$2(function (callback) { + var img = document.createElement('img'); + var done = function (dimensions) { + if (img.parentNode) { + img.parentNode.removeChild(img); + } + callback(dimensions); + }; + img.onload = function () { + var width = parseIntAndGetMax(img.width, img.clientWidth); + var height = parseIntAndGetMax(img.height, img.clientHeight); + var dimensions = { + width: width, + height: height + }; + done(global$2.resolve(dimensions)); + }; + img.onerror = function () { + done(global$2.reject('Failed to get image dimensions for: ' + url)); + }; + var style = img.style; + style.visibility = 'hidden'; + style.position = 'fixed'; + style.bottom = style.left = '0px'; + style.width = style.height = 'auto'; + document.body.appendChild(img); + img.src = url; + }); + }; + var removePixelSuffix = function (value) { + if (value) { + value = value.replace(/px$/, ''); + } + return value; + }; + var addPixelSuffix = function (value) { + if (value.length > 0 && /^[0-9]+$/.test(value)) { + value += 'px'; + } + return value; + }; + var mergeMargins = function (css) { + if (css.margin) { + var splitMargin = String(css.margin).split(' '); + switch (splitMargin.length) { + case 1: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[0]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[0]; + css['margin-left'] = css['margin-left'] || splitMargin[0]; + break; + case 2: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[0]; + css['margin-left'] = css['margin-left'] || splitMargin[1]; + break; + case 3: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[2]; + css['margin-left'] = css['margin-left'] || splitMargin[1]; + break; + case 4: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[2]; + css['margin-left'] = css['margin-left'] || splitMargin[3]; + } + delete css.margin; + } + return css; + }; + var createImageList = function (editor, callback) { + var imageList = getImageList(editor); + if (typeof imageList === 'string') { + global$3.send({ + url: imageList, + success: function (text) { + callback(JSON.parse(text)); + } + }); + } else if (typeof imageList === 'function') { + imageList(callback); + } else { + callback(imageList); + } + }; + var waitLoadImage = function (editor, data, imgElm) { + var selectImage = function () { + imgElm.onload = imgElm.onerror = null; + if (editor.selection) { + editor.selection.select(imgElm); + editor.nodeChanged(); + } + }; + imgElm.onload = function () { + if (!data.width && !data.height && hasDimensions(editor)) { + editor.dom.setAttribs(imgElm, { + width: String(imgElm.clientWidth), + height: String(imgElm.clientHeight) + }); + } + selectImage(); + }; + imgElm.onerror = selectImage; + }; + var blobToDataUri = function (blob) { + return new global$2(function (resolve, reject) { + var reader = new FileReader(); + reader.onload = function () { + resolve(reader.result); + }; + reader.onerror = function () { + reject(reader.error.message); + }; + reader.readAsDataURL(blob); + }); + }; + var isPlaceholderImage = function (imgElm) { + return imgElm.nodeName === 'IMG' && (imgElm.hasAttribute('data-mce-object') || imgElm.hasAttribute('data-mce-placeholder')); + }; + + var DOM = global$1.DOM; + var getHspace = function (image) { + if (image.style.marginLeft && image.style.marginRight && image.style.marginLeft === image.style.marginRight) { + return removePixelSuffix(image.style.marginLeft); + } else { + return ''; + } + }; + var getVspace = function (image) { + if (image.style.marginTop && image.style.marginBottom && image.style.marginTop === image.style.marginBottom) { + return removePixelSuffix(image.style.marginTop); + } else { + return ''; + } + }; + var getBorder = function (image) { + if (image.style.borderWidth) { + return removePixelSuffix(image.style.borderWidth); + } else { + return ''; + } + }; + var getAttrib = function (image, name) { + if (image.hasAttribute(name)) { + return image.getAttribute(name); + } else { + return ''; + } + }; + var getStyle = function (image, name) { + return image.style[name] ? image.style[name] : ''; + }; + var hasCaption = function (image) { + return image.parentNode !== null && image.parentNode.nodeName === 'FIGURE'; + }; + var updateAttrib = function (image, name, value) { + if (value === '') { + image.removeAttribute(name); + } else { + image.setAttribute(name, value); + } + }; + var wrapInFigure = function (image) { + var figureElm = DOM.create('figure', { class: 'image' }); + DOM.insertAfter(figureElm, image); + figureElm.appendChild(image); + figureElm.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption')); + figureElm.contentEditable = 'false'; + }; + var removeFigure = function (image) { + var figureElm = image.parentNode; + DOM.insertAfter(image, figureElm); + DOM.remove(figureElm); + }; + var toggleCaption = function (image) { + if (hasCaption(image)) { + removeFigure(image); + } else { + wrapInFigure(image); + } + }; + var normalizeStyle = function (image, normalizeCss) { + var attrValue = image.getAttribute('style'); + var value = normalizeCss(attrValue !== null ? attrValue : ''); + if (value.length > 0) { + image.setAttribute('style', value); + image.setAttribute('data-mce-style', value); + } else { + image.removeAttribute('style'); + } + }; + var setSize = function (name, normalizeCss) { + return function (image, name, value) { + if (image.style[name]) { + image.style[name] = addPixelSuffix(value); + normalizeStyle(image, normalizeCss); + } else { + updateAttrib(image, name, value); + } + }; + }; + var getSize = function (image, name) { + if (image.style[name]) { + return removePixelSuffix(image.style[name]); + } else { + return getAttrib(image, name); + } + }; + var setHspace = function (image, value) { + var pxValue = addPixelSuffix(value); + image.style.marginLeft = pxValue; + image.style.marginRight = pxValue; + }; + var setVspace = function (image, value) { + var pxValue = addPixelSuffix(value); + image.style.marginTop = pxValue; + image.style.marginBottom = pxValue; + }; + var setBorder = function (image, value) { + var pxValue = addPixelSuffix(value); + image.style.borderWidth = pxValue; + }; + var setBorderStyle = function (image, value) { + image.style.borderStyle = value; + }; + var getBorderStyle = function (image) { + return getStyle(image, 'borderStyle'); + }; + var isFigure = function (elm) { + return elm.nodeName === 'FIGURE'; + }; + var isImage = function (elm) { + return elm.nodeName === 'IMG'; + }; + var getIsDecorative = function (image) { + return DOM.getAttrib(image, 'alt').length === 0 && DOM.getAttrib(image, 'role') === 'presentation'; + }; + var getAlt = function (image) { + if (getIsDecorative(image)) { + return ''; + } else { + return getAttrib(image, 'alt'); + } + }; + var defaultData = function () { + return { + src: '', + alt: '', + title: '', + width: '', + height: '', + class: '', + style: '', + caption: false, + hspace: '', + vspace: '', + border: '', + borderStyle: '', + isDecorative: false + }; + }; + var getStyleValue = function (normalizeCss, data) { + var image = document.createElement('img'); + updateAttrib(image, 'style', data.style); + if (getHspace(image) || data.hspace !== '') { + setHspace(image, data.hspace); + } + if (getVspace(image) || data.vspace !== '') { + setVspace(image, data.vspace); + } + if (getBorder(image) || data.border !== '') { + setBorder(image, data.border); + } + if (getBorderStyle(image) || data.borderStyle !== '') { + setBorderStyle(image, data.borderStyle); + } + return normalizeCss(image.getAttribute('style')); + }; + var create = function (normalizeCss, data) { + var image = document.createElement('img'); + write(normalizeCss, __assign(__assign({}, data), { caption: false }), image); + setAlt(image, data.alt, data.isDecorative); + if (data.caption) { + var figure = DOM.create('figure', { class: 'image' }); + figure.appendChild(image); + figure.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption')); + figure.contentEditable = 'false'; + return figure; + } else { + return image; + } + }; + var read = function (normalizeCss, image) { + return { + src: getAttrib(image, 'src'), + alt: getAlt(image), + title: getAttrib(image, 'title'), + width: getSize(image, 'width'), + height: getSize(image, 'height'), + class: getAttrib(image, 'class'), + style: normalizeCss(getAttrib(image, 'style')), + caption: hasCaption(image), + hspace: getHspace(image), + vspace: getVspace(image), + border: getBorder(image), + borderStyle: getStyle(image, 'borderStyle'), + isDecorative: getIsDecorative(image) + }; + }; + var updateProp = function (image, oldData, newData, name, set) { + if (newData[name] !== oldData[name]) { + set(image, name, newData[name]); + } + }; + var setAlt = function (image, alt, isDecorative) { + if (isDecorative) { + DOM.setAttrib(image, 'role', 'presentation'); + var sugarImage = SugarElement.fromDom(image); + set(sugarImage, 'alt', ''); + } else { + if (isNull(alt)) { + var sugarImage = SugarElement.fromDom(image); + remove(sugarImage, 'alt'); + } else { + var sugarImage = SugarElement.fromDom(image); + set(sugarImage, 'alt', alt); + } + if (DOM.getAttrib(image, 'role') === 'presentation') { + DOM.setAttrib(image, 'role', ''); + } + } + }; + var updateAlt = function (image, oldData, newData) { + if (newData.alt !== oldData.alt || newData.isDecorative !== oldData.isDecorative) { + setAlt(image, newData.alt, newData.isDecorative); + } + }; + var normalized = function (set, normalizeCss) { + return function (image, name, value) { + set(image, value); + normalizeStyle(image, normalizeCss); + }; + }; + var write = function (normalizeCss, newData, image) { + var oldData = read(normalizeCss, image); + updateProp(image, oldData, newData, 'caption', function (image, _name, _value) { + return toggleCaption(image); + }); + updateProp(image, oldData, newData, 'src', updateAttrib); + updateProp(image, oldData, newData, 'title', updateAttrib); + updateProp(image, oldData, newData, 'width', setSize('width', normalizeCss)); + updateProp(image, oldData, newData, 'height', setSize('height', normalizeCss)); + updateProp(image, oldData, newData, 'class', updateAttrib); + updateProp(image, oldData, newData, 'style', normalized(function (image, value) { + return updateAttrib(image, 'style', value); + }, normalizeCss)); + updateProp(image, oldData, newData, 'hspace', normalized(setHspace, normalizeCss)); + updateProp(image, oldData, newData, 'vspace', normalized(setVspace, normalizeCss)); + updateProp(image, oldData, newData, 'border', normalized(setBorder, normalizeCss)); + updateProp(image, oldData, newData, 'borderStyle', normalized(setBorderStyle, normalizeCss)); + updateAlt(image, oldData, newData); + }; + + var normalizeCss = function (editor, cssText) { + var css = editor.dom.styles.parse(cssText); + var mergedCss = mergeMargins(css); + var compressed = editor.dom.styles.parse(editor.dom.styles.serialize(mergedCss)); + return editor.dom.styles.serialize(compressed); + }; + var getSelectedImage = function (editor) { + var imgElm = editor.selection.getNode(); + var figureElm = editor.dom.getParent(imgElm, 'figure.image'); + if (figureElm) { + return editor.dom.select('img', figureElm)[0]; + } + if (imgElm && (imgElm.nodeName !== 'IMG' || isPlaceholderImage(imgElm))) { + return null; + } + return imgElm; + }; + var splitTextBlock = function (editor, figure) { + var dom = editor.dom; + var textBlock = dom.getParent(figure.parentNode, function (node) { + return !!editor.schema.getTextBlockElements()[node.nodeName]; + }, editor.getBody()); + if (textBlock) { + return dom.split(textBlock, figure); + } else { + return figure; + } + }; + var readImageDataFromSelection = function (editor) { + var image = getSelectedImage(editor); + return image ? read(function (css) { + return normalizeCss(editor, css); + }, image) : defaultData(); + }; + var insertImageAtCaret = function (editor, data) { + var elm = create(function (css) { + return normalizeCss(editor, css); + }, data); + editor.dom.setAttrib(elm, 'data-mce-id', '__mcenew'); + editor.focus(); + editor.selection.setContent(elm.outerHTML); + var insertedElm = editor.dom.select('*[data-mce-id="__mcenew"]')[0]; + editor.dom.setAttrib(insertedElm, 'data-mce-id', null); + if (isFigure(insertedElm)) { + var figure = splitTextBlock(editor, insertedElm); + editor.selection.select(figure); + } else { + editor.selection.select(insertedElm); + } + }; + var syncSrcAttr = function (editor, image) { + editor.dom.setAttrib(image, 'src', image.getAttribute('src')); + }; + var deleteImage = function (editor, image) { + if (image) { + var elm = editor.dom.is(image.parentNode, 'figure.image') ? image.parentNode : image; + editor.dom.remove(elm); + editor.focus(); + editor.nodeChanged(); + if (editor.dom.isEmpty(editor.getBody())) { + editor.setContent(''); + editor.selection.setCursorLocation(); + } + } + }; + var writeImageDataToSelection = function (editor, data) { + var image = getSelectedImage(editor); + write(function (css) { + return normalizeCss(editor, css); + }, data, image); + syncSrcAttr(editor, image); + if (isFigure(image.parentNode)) { + var figure = image.parentNode; + splitTextBlock(editor, figure); + editor.selection.select(image.parentNode); + } else { + editor.selection.select(image); + waitLoadImage(editor, data, image); + } + }; + var insertOrUpdateImage = function (editor, partialData) { + var image = getSelectedImage(editor); + if (image) { + var selectedImageData = read(function (css) { + return normalizeCss(editor, css); + }, image); + var data = __assign(__assign({}, selectedImageData), partialData); + if (data.src) { + writeImageDataToSelection(editor, data); + } else { + deleteImage(editor, image); + } + } else if (partialData.src) { + insertImageAtCaret(editor, __assign(__assign({}, defaultData()), partialData)); + } + }; + + var hasOwnProperty = Object.prototype.hasOwnProperty; + var deep = function (old, nu) { + var bothObjects = isObject(old) && isObject(nu); + return bothObjects ? deepMerge(old, nu) : nu; + }; + var baseMerge = function (merger) { + return function () { + var objects = new Array(arguments.length); + for (var i = 0; i < objects.length; i++) { + objects[i] = arguments[i]; + } + if (objects.length === 0) { + throw new Error('Can\'t merge zero objects'); + } + var ret = {}; + for (var j = 0; j < objects.length; j++) { + var curObject = objects[j]; + for (var key in curObject) { + if (hasOwnProperty.call(curObject, key)) { + ret[key] = merger(ret[key], curObject[key]); + } + } + } + return ret; + }; + }; + var deepMerge = baseMerge(deep); + + var global$4 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var getValue = function (item) { + return isString(item.value) ? item.value : ''; + }; + var getText = function (item) { + if (isString(item.text)) { + return item.text; + } else if (isString(item.title)) { + return item.title; + } else { + return ''; + } + }; + var sanitizeList = function (list, extractValue) { + var out = []; + global$4.each(list, function (item) { + var text = getText(item); + if (item.menu !== undefined) { + var items = sanitizeList(item.menu, extractValue); + out.push({ + text: text, + items: items + }); + } else { + var value = extractValue(item); + out.push({ + text: text, + value: value + }); + } + }); + return out; + }; + var sanitizer = function (extracter) { + if (extracter === void 0) { + extracter = getValue; + } + return function (list) { + if (list) { + return Optional.from(list).map(function (list) { + return sanitizeList(list, extracter); + }); + } else { + return Optional.none(); + } + }; + }; + var sanitize = function (list) { + return sanitizer(getValue)(list); + }; + var isGroup = function (item) { + return Object.prototype.hasOwnProperty.call(item, 'items'); + }; + var findEntryDelegate = function (list, value) { + return findMap(list, function (item) { + if (isGroup(item)) { + return findEntryDelegate(item.items, value); + } else if (item.value === value) { + return Optional.some(item); + } else { + return Optional.none(); + } + }); + }; + var findEntry = function (optList, value) { + return optList.bind(function (list) { + return findEntryDelegate(list, value); + }); + }; + var ListUtils = { + sanitizer: sanitizer, + sanitize: sanitize, + findEntry: findEntry + }; + + var pathJoin = function (path1, path2) { + if (path1) { + return path1.replace(/\/$/, '') + '/' + path2.replace(/^\//, ''); + } + return path2; + }; + function Uploader (settings) { + var defaultHandler = function (blobInfo, success, failure, progress) { + var xhr = new XMLHttpRequest(); + xhr.open('POST', settings.url); + xhr.withCredentials = settings.credentials; + xhr.upload.onprogress = function (e) { + progress(e.loaded / e.total * 100); + }; + xhr.onerror = function () { + failure('Image upload failed due to a XHR Transport error. Code: ' + xhr.status); + }; + xhr.onload = function () { + if (xhr.status < 200 || xhr.status >= 300) { + failure('HTTP Error: ' + xhr.status); + return; + } + var json = JSON.parse(xhr.responseText); + if (!json || typeof json.location !== 'string') { + failure('Invalid JSON: ' + xhr.responseText); + return; + } + success(pathJoin(settings.basePath, json.location)); + }; + var formData = new FormData(); + formData.append('file', blobInfo.blob(), blobInfo.filename()); + xhr.send(formData); + }; + var uploadBlob = function (blobInfo, handler) { + return new global$2(function (resolve, reject) { + try { + handler(blobInfo, resolve, reject, noop); + } catch (ex) { + reject(ex.message); + } + }); + }; + var isDefaultHandler = function (handler) { + return handler === defaultHandler; + }; + var upload = function (blobInfo) { + return !settings.url && isDefaultHandler(settings.handler) ? global$2.reject('Upload url missing from the settings.') : uploadBlob(blobInfo, settings.handler); + }; + settings = global$4.extend({ + credentials: false, + handler: defaultHandler + }, settings); + return { upload: upload }; + } + + var makeTab = function (_info) { + return { + title: 'Advanced', + name: 'advanced', + items: [ + { + type: 'input', + label: 'Style', + name: 'style' + }, + { + type: 'grid', + columns: 2, + items: [ + { + type: 'input', + label: 'Vertical space', + name: 'vspace', + inputMode: 'numeric' + }, + { + type: 'input', + label: 'Horizontal space', + name: 'hspace', + inputMode: 'numeric' + }, + { + type: 'input', + label: 'Border width', + name: 'border', + inputMode: 'numeric' + }, + { + type: 'listbox', + name: 'borderstyle', + label: 'Border style', + items: [ + { + text: 'Select...', + value: '' + }, + { + text: 'Solid', + value: 'solid' + }, + { + text: 'Dotted', + value: 'dotted' + }, + { + text: 'Dashed', + value: 'dashed' + }, + { + text: 'Double', + value: 'double' + }, + { + text: 'Groove', + value: 'groove' + }, + { + text: 'Ridge', + value: 'ridge' + }, + { + text: 'Inset', + value: 'inset' + }, + { + text: 'Outset', + value: 'outset' + }, + { + text: 'None', + value: 'none' + }, + { + text: 'Hidden', + value: 'hidden' + } + ] + } + ] + } + ] + }; + }; + var AdvTab = { makeTab: makeTab }; + + var collect = function (editor) { + var urlListSanitizer = ListUtils.sanitizer(function (item) { + return editor.convertURL(item.value || item.url, 'src'); + }); + var futureImageList = new global$2(function (completer) { + createImageList(editor, function (imageList) { + completer(urlListSanitizer(imageList).map(function (items) { + return flatten([ + [{ + text: 'None', + value: '' + }], + items + ]); + })); + }); + }); + var classList = ListUtils.sanitize(getClassList(editor)); + var hasAdvTab$1 = hasAdvTab(editor); + var hasUploadTab$1 = hasUploadTab(editor); + var hasUploadUrl$1 = hasUploadUrl(editor); + var hasUploadHandler$1 = hasUploadHandler(editor); + var image = readImageDataFromSelection(editor); + var hasDescription$1 = hasDescription(editor); + var hasImageTitle$1 = hasImageTitle(editor); + var hasDimensions$1 = hasDimensions(editor); + var hasImageCaption$1 = hasImageCaption(editor); + var hasAccessibilityOptions = showAccessibilityOptions(editor); + var url = getUploadUrl(editor); + var basePath = getUploadBasePath(editor); + var credentials = getUploadCredentials(editor); + var handler = getUploadHandler(editor); + var automaticUploads = isAutomaticUploadsEnabled(editor); + var prependURL = Optional.some(getPrependUrl(editor)).filter(function (preUrl) { + return isString(preUrl) && preUrl.length > 0; + }); + return futureImageList.then(function (imageList) { + return { + image: image, + imageList: imageList, + classList: classList, + hasAdvTab: hasAdvTab$1, + hasUploadTab: hasUploadTab$1, + hasUploadUrl: hasUploadUrl$1, + hasUploadHandler: hasUploadHandler$1, + hasDescription: hasDescription$1, + hasImageTitle: hasImageTitle$1, + hasDimensions: hasDimensions$1, + hasImageCaption: hasImageCaption$1, + url: url, + basePath: basePath, + credentials: credentials, + handler: handler, + prependURL: prependURL, + hasAccessibilityOptions: hasAccessibilityOptions, + automaticUploads: automaticUploads + }; + }); + }; + + var makeItems = function (info) { + var imageUrl = { + name: 'src', + type: 'urlinput', + filetype: 'image', + label: 'Source' + }; + var imageList = info.imageList.map(function (items) { + return { + name: 'images', + type: 'listbox', + label: 'Image list', + items: items + }; + }); + var imageDescription = { + name: 'alt', + type: 'input', + label: 'Alternative description', + disabled: info.hasAccessibilityOptions && info.image.isDecorative + }; + var imageTitle = { + name: 'title', + type: 'input', + label: 'Image title' + }; + var imageDimensions = { + name: 'dimensions', + type: 'sizeinput' + }; + var isDecorative = { + type: 'label', + label: 'Accessibility', + items: [{ + name: 'isDecorative', + type: 'checkbox', + label: 'Image is decorative' + }] + }; + var classList = info.classList.map(function (items) { + return { + name: 'classes', + type: 'listbox', + label: 'Class', + items: items + }; + }); + var caption = { + type: 'label', + label: 'Caption', + items: [{ + type: 'checkbox', + name: 'caption', + label: 'Show caption' + }] + }; + return flatten([ + [imageUrl], + imageList.toArray(), + info.hasAccessibilityOptions && info.hasDescription ? [isDecorative] : [], + info.hasDescription ? [imageDescription] : [], + info.hasImageTitle ? [imageTitle] : [], + info.hasDimensions ? [imageDimensions] : [], + [{ + type: 'grid', + columns: 2, + items: flatten([ + classList.toArray(), + info.hasImageCaption ? [caption] : [] + ]) + }] + ]); + }; + var makeTab$1 = function (info) { + return { + title: 'General', + name: 'general', + items: makeItems(info) + }; + }; + var MainTab = { + makeTab: makeTab$1, + makeItems: makeItems + }; + + var makeTab$2 = function (_info) { + var items = [{ + type: 'dropzone', + name: 'fileinput' + }]; + return { + title: 'Upload', + name: 'upload', + items: items + }; + }; + var UploadTab = { makeTab: makeTab$2 }; + + var createState = function (info) { + return { + prevImage: ListUtils.findEntry(info.imageList, info.image.src), + prevAlt: info.image.alt, + open: true + }; + }; + var fromImageData = function (image) { + return { + src: { + value: image.src, + meta: {} + }, + images: image.src, + alt: image.alt, + title: image.title, + dimensions: { + width: image.width, + height: image.height + }, + classes: image.class, + caption: image.caption, + style: image.style, + vspace: image.vspace, + border: image.border, + hspace: image.hspace, + borderstyle: image.borderStyle, + fileinput: [], + isDecorative: image.isDecorative + }; + }; + var toImageData = function (data, removeEmptyAlt) { + return { + src: data.src.value, + alt: data.alt.length === 0 && removeEmptyAlt ? null : data.alt, + title: data.title, + width: data.dimensions.width, + height: data.dimensions.height, + class: data.classes, + style: data.style, + caption: data.caption, + hspace: data.hspace, + vspace: data.vspace, + border: data.border, + borderStyle: data.borderstyle, + isDecorative: data.isDecorative + }; + }; + var addPrependUrl2 = function (info, srcURL) { + if (!/^(?:[a-zA-Z]+:)?\/\//.test(srcURL)) { + return info.prependURL.bind(function (prependUrl) { + if (srcURL.substring(0, prependUrl.length) !== prependUrl) { + return Optional.some(prependUrl + srcURL); + } + return Optional.none(); + }); + } + return Optional.none(); + }; + var addPrependUrl = function (info, api) { + var data = api.getData(); + addPrependUrl2(info, data.src.value).each(function (srcURL) { + api.setData({ + src: { + value: srcURL, + meta: data.src.meta + } + }); + }); + }; + var formFillFromMeta2 = function (info, data, meta) { + if (info.hasDescription && isString(meta.alt)) { + data.alt = meta.alt; + } + if (info.hasAccessibilityOptions) { + data.isDecorative = meta.isDecorative || data.isDecorative || false; + } + if (info.hasImageTitle && isString(meta.title)) { + data.title = meta.title; + } + if (info.hasDimensions) { + if (isString(meta.width)) { + data.dimensions.width = meta.width; + } + if (isString(meta.height)) { + data.dimensions.height = meta.height; + } + } + if (isString(meta.class)) { + ListUtils.findEntry(info.classList, meta.class).each(function (entry) { + data.classes = entry.value; + }); + } + if (info.hasImageCaption) { + if (isBoolean(meta.caption)) { + data.caption = meta.caption; + } + } + if (info.hasAdvTab) { + if (isString(meta.style)) { + data.style = meta.style; + } + if (isString(meta.vspace)) { + data.vspace = meta.vspace; + } + if (isString(meta.border)) { + data.border = meta.border; + } + if (isString(meta.hspace)) { + data.hspace = meta.hspace; + } + if (isString(meta.borderstyle)) { + data.borderstyle = meta.borderstyle; + } + } + }; + var formFillFromMeta = function (info, api) { + var data = api.getData(); + var meta = data.src.meta; + if (meta !== undefined) { + var newData = deepMerge({}, data); + formFillFromMeta2(info, newData, meta); + api.setData(newData); + } + }; + var calculateImageSize = function (helpers, info, state, api) { + var data = api.getData(); + var url = data.src.value; + var meta = data.src.meta || {}; + if (!meta.width && !meta.height && info.hasDimensions) { + helpers.imageSize(url).then(function (size) { + if (state.open) { + api.setData({ dimensions: size }); + } + }); + } + }; + var updateImagesDropdown = function (info, state, api) { + var data = api.getData(); + var image = ListUtils.findEntry(info.imageList, data.src.value); + state.prevImage = image; + api.setData({ + images: image.map(function (entry) { + return entry.value; + }).getOr('') + }); + }; + var changeSrc = function (helpers, info, state, api) { + addPrependUrl(info, api); + formFillFromMeta(info, api); + calculateImageSize(helpers, info, state, api); + updateImagesDropdown(info, state, api); + }; + var changeImages = function (helpers, info, state, api) { + var data = api.getData(); + var image = ListUtils.findEntry(info.imageList, data.images); + image.each(function (img) { + var updateAlt = data.alt === '' || state.prevImage.map(function (image) { + return image.text === data.alt; + }).getOr(false); + if (updateAlt) { + if (img.value === '') { + api.setData({ + src: img, + alt: state.prevAlt + }); + } else { + api.setData({ + src: img, + alt: img.text + }); + } + } else { + api.setData({ src: img }); + } + }); + state.prevImage = image; + changeSrc(helpers, info, state, api); + }; + var calcVSpace = function (css) { + var matchingTopBottom = css['margin-top'] && css['margin-bottom'] && css['margin-top'] === css['margin-bottom']; + return matchingTopBottom ? removePixelSuffix(String(css['margin-top'])) : ''; + }; + var calcHSpace = function (css) { + var matchingLeftRight = css['margin-right'] && css['margin-left'] && css['margin-right'] === css['margin-left']; + return matchingLeftRight ? removePixelSuffix(String(css['margin-right'])) : ''; + }; + var calcBorderWidth = function (css) { + return css['border-width'] ? removePixelSuffix(String(css['border-width'])) : ''; + }; + var calcBorderStyle = function (css) { + return css['border-style'] ? String(css['border-style']) : ''; + }; + var calcStyle = function (parseStyle, serializeStyle, css) { + return serializeStyle(parseStyle(serializeStyle(css))); + }; + var changeStyle2 = function (parseStyle, serializeStyle, data) { + var css = mergeMargins(parseStyle(data.style)); + var dataCopy = deepMerge({}, data); + dataCopy.vspace = calcVSpace(css); + dataCopy.hspace = calcHSpace(css); + dataCopy.border = calcBorderWidth(css); + dataCopy.borderstyle = calcBorderStyle(css); + dataCopy.style = calcStyle(parseStyle, serializeStyle, css); + return dataCopy; + }; + var changeStyle = function (helpers, api) { + var data = api.getData(); + var newData = changeStyle2(helpers.parseStyle, helpers.serializeStyle, data); + api.setData(newData); + }; + var changeAStyle = function (helpers, info, api) { + var data = deepMerge(fromImageData(info.image), api.getData()); + var style = getStyleValue(helpers.normalizeCss, toImageData(data, false)); + api.setData({ style: style }); + }; + var changeFileInput = function (helpers, info, state, api) { + var data = api.getData(); + api.block('Uploading image'); + head(data.fileinput).fold(function () { + api.unblock(); + }, function (file) { + var blobUri = URL.createObjectURL(file); + var uploader = Uploader({ + url: info.url, + basePath: info.basePath, + credentials: info.credentials, + handler: info.handler + }); + var finalize = function () { + api.unblock(); + URL.revokeObjectURL(blobUri); + }; + var updateSrcAndSwitchTab = function (url) { + api.setData({ + src: { + value: url, + meta: {} + } + }); + api.showTab('general'); + changeSrc(helpers, info, state, api); + }; + blobToDataUri(file).then(function (dataUrl) { + var blobInfo = helpers.createBlobCache(file, blobUri, dataUrl); + if (info.automaticUploads) { + uploader.upload(blobInfo).then(function (url) { + updateSrcAndSwitchTab(url); + finalize(); + }).catch(function (err) { + finalize(); + helpers.alertErr(err); + }); + } else { + helpers.addToBlobCache(blobInfo); + updateSrcAndSwitchTab(blobInfo.blobUri()); + api.unblock(); + } + }); + }); + }; + var changeHandler = function (helpers, info, state) { + return function (api, evt) { + if (evt.name === 'src') { + changeSrc(helpers, info, state, api); + } else if (evt.name === 'images') { + changeImages(helpers, info, state, api); + } else if (evt.name === 'alt') { + state.prevAlt = api.getData().alt; + } else if (evt.name === 'style') { + changeStyle(helpers, api); + } else if (evt.name === 'vspace' || evt.name === 'hspace' || evt.name === 'border' || evt.name === 'borderstyle') { + changeAStyle(helpers, info, api); + } else if (evt.name === 'fileinput') { + changeFileInput(helpers, info, state, api); + } else if (evt.name === 'isDecorative') { + if (api.getData().isDecorative) { + api.disable('alt'); + } else { + api.enable('alt'); + } + } + }; + }; + var closeHandler = function (state) { + return function () { + state.open = false; + }; + }; + var makeDialogBody = function (info) { + if (info.hasAdvTab || info.hasUploadUrl || info.hasUploadHandler) { + var tabPanel = { + type: 'tabpanel', + tabs: flatten([ + [MainTab.makeTab(info)], + info.hasAdvTab ? [AdvTab.makeTab(info)] : [], + info.hasUploadTab && (info.hasUploadUrl || info.hasUploadHandler) ? [UploadTab.makeTab(info)] : [] + ]) + }; + return tabPanel; + } else { + var panel = { + type: 'panel', + items: MainTab.makeItems(info) + }; + return panel; + } + }; + var makeDialog = function (helpers) { + return function (info) { + var state = createState(info); + return { + title: 'Insert/Edit Image', + size: 'normal', + body: makeDialogBody(info), + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: fromImageData(info.image), + onSubmit: helpers.onSubmit(info), + onChange: changeHandler(helpers, info, state), + onClose: closeHandler(state) + }; + }; + }; + var submitHandler = function (editor) { + return function (info) { + return function (api) { + var data = deepMerge(fromImageData(info.image), api.getData()); + editor.execCommand('mceUpdateImage', false, toImageData(data, info.hasAccessibilityOptions)); + editor.editorUpload.uploadImagesAuto(); + api.close(); + }; + }; + }; + var imageSize = function (editor) { + return function (url) { + return getImageSize(editor.documentBaseURI.toAbsolute(url)).then(function (dimensions) { + return { + width: String(dimensions.width), + height: String(dimensions.height) + }; + }); + }; + }; + var createBlobCache = function (editor) { + return function (file, blobUri, dataUrl) { + return editor.editorUpload.blobCache.create({ + blob: file, + blobUri: blobUri, + name: file.name ? file.name.replace(/\.[^\.]+$/, '') : null, + filename: file.name, + base64: dataUrl.split(',')[1] + }); + }; + }; + var addToBlobCache = function (editor) { + return function (blobInfo) { + editor.editorUpload.blobCache.add(blobInfo); + }; + }; + var alertErr = function (editor) { + return function (message) { + editor.windowManager.alert(message); + }; + }; + var normalizeCss$1 = function (editor) { + return function (cssText) { + return normalizeCss(editor, cssText); + }; + }; + var parseStyle = function (editor) { + return function (cssText) { + return editor.dom.parseStyle(cssText); + }; + }; + var serializeStyle = function (editor) { + return function (stylesArg, name) { + return editor.dom.serializeStyle(stylesArg, name); + }; + }; + var Dialog = function (editor) { + var helpers = { + onSubmit: submitHandler(editor), + imageSize: imageSize(editor), + addToBlobCache: addToBlobCache(editor), + createBlobCache: createBlobCache(editor), + alertErr: alertErr(editor), + normalizeCss: normalizeCss$1(editor), + parseStyle: parseStyle(editor), + serializeStyle: serializeStyle(editor) + }; + var open = function () { + collect(editor).then(makeDialog(helpers)).then(editor.windowManager.open); + }; + return { open: open }; + }; + + var register = function (editor) { + editor.addCommand('mceImage', Dialog(editor).open); + editor.addCommand('mceUpdateImage', function (_ui, data) { + editor.undoManager.transact(function () { + return insertOrUpdateImage(editor, data); + }); + }); + }; + + var hasImageClass = function (node) { + var className = node.attr('class'); + return className && /\bimage\b/.test(className); + }; + var toggleContentEditableState = function (state) { + return function (nodes) { + var i = nodes.length; + var toggleContentEditable = function (node) { + node.attr('contenteditable', state ? 'true' : null); + }; + while (i--) { + var node = nodes[i]; + if (hasImageClass(node)) { + node.attr('contenteditable', state ? 'false' : null); + global$4.each(node.getAll('figcaption'), toggleContentEditable); + } + } + }; + }; + var setup = function (editor) { + editor.on('PreInit', function () { + editor.parser.addNodeFilter('figure', toggleContentEditableState(true)); + editor.serializer.addNodeFilter('figure', toggleContentEditableState(false)); + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('image', { + icon: 'image', + tooltip: 'Insert/edit image', + onAction: Dialog(editor).open, + onSetup: function (buttonApi) { + return editor.selection.selectorChangedWithUnbind('img:not([data-mce-object],[data-mce-placeholder]),figure.image', buttonApi.setActive).unbind; + } + }); + editor.ui.registry.addMenuItem('image', { + icon: 'image', + text: 'Image...', + onAction: Dialog(editor).open + }); + editor.ui.registry.addContextMenu('image', { + update: function (element) { + return isFigure(element) || isImage(element) && !isPlaceholderImage(element) ? ['image'] : []; + } + }); + }; + + function Plugin () { + global.add('image', function (editor) { + setup(editor); + register$1(editor); + register(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/image/plugin.min.js b/src/assets/tinymce/plugins/image/plugin.min.js new file mode 100644 index 00000000..7b454364 --- /dev/null +++ b/src/assets/tinymce/plugins/image/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var t,e,n,r,o,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=function(){return(c=Object.assign||function(e){for(var t,n=1,r=arguments.length;n 1) { + console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: node }; + }; + var fromPoint = function (docElm, x, y) { + return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); + }; + var SugarElement = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var is = function (element, selector) { + var dom = element.dom; + if (dom.nodeType !== ELEMENT) { + return false; + } else { + var elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } + }; + + var Global = typeof window !== 'undefined' ? window : Function('return this;')(); + + var child = function (scope, predicate) { + var pred = function (node) { + return predicate(SugarElement.fromDom(node)); + }; + var result = find(scope.dom.childNodes, pred); + return result.map(SugarElement.fromDom); + }; + + var child$1 = function (scope, selector) { + return child(scope, function (e) { + return is(e, selector); + }); + }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var global$4 = tinymce.util.Tools.resolve('tinymce.util.URI'); + + var getToolbarItems = function (editor) { + return editor.getParam('imagetools_toolbar', 'rotateleft rotateright flipv fliph editimage imageoptions'); + }; + var getProxyUrl = function (editor) { + return editor.getParam('imagetools_proxy'); + }; + var getCorsHosts = function (editor) { + return editor.getParam('imagetools_cors_hosts', [], 'string[]'); + }; + var getCredentialsHosts = function (editor) { + return editor.getParam('imagetools_credentials_hosts', [], 'string[]'); + }; + var getFetchImage = function (editor) { + return Optional.from(editor.getParam('imagetools_fetch_image', null, 'function')); + }; + var getApiKey = function (editor) { + return editor.getParam('api_key', editor.getParam('imagetools_api_key', '', 'string'), 'string'); + }; + var getUploadTimeout = function (editor) { + return editor.getParam('images_upload_timeout', 30000, 'number'); + }; + var shouldReuseFilename = function (editor) { + return editor.getParam('images_reuse_filename', false, 'boolean'); + }; + + function getImageSize(img) { + var width, height; + function isPxValue(value) { + return /^[0-9\.]+px$/.test(value); + } + width = img.style.width; + height = img.style.height; + if (width || height) { + if (isPxValue(width) && isPxValue(height)) { + return { + w: parseInt(width, 10), + h: parseInt(height, 10) + }; + } + return null; + } + width = img.width; + height = img.height; + if (width && height) { + return { + w: parseInt(width, 10), + h: parseInt(height, 10) + }; + } + return null; + } + function setImageSize(img, size) { + var width, height; + if (size) { + width = img.style.width; + height = img.style.height; + if (width || height) { + img.style.width = size.w + 'px'; + img.style.height = size.h + 'px'; + img.removeAttribute('data-mce-style'); + } + width = img.width; + height = img.height; + if (width || height) { + img.setAttribute('width', String(size.w)); + img.setAttribute('height', String(size.h)); + } + } + } + function getNaturalImageSize(img) { + return { + w: img.naturalWidth, + h: img.naturalHeight + }; + } + + var count = 0; + var getFigureImg = function (elem) { + return child$1(SugarElement.fromDom(elem), 'img'); + }; + var isFigure = function (editor, elem) { + return editor.dom.is(elem, 'figure'); + }; + var isImage = function (editor, imgNode) { + return editor.dom.is(imgNode, 'img:not([data-mce-object],[data-mce-placeholder])'); + }; + var getEditableImage = function (editor, node) { + var isEditable = function (imgNode) { + return isImage(editor, imgNode) && (isLocalImage(editor, imgNode) || isCorsImage(editor, imgNode) || isNonNullable(getProxyUrl(editor))); + }; + if (isFigure(editor, node)) { + return getFigureImg(node).bind(function (img) { + return isEditable(img.dom) ? Optional.some(img.dom) : Optional.none(); + }); + } else { + return isEditable(node) ? Optional.some(node) : Optional.none(); + } + }; + var displayError = function (editor, error) { + editor.notificationManager.open({ + text: error, + type: 'error' + }); + }; + var getSelectedImage = function (editor) { + var elem = editor.selection.getNode(); + var figureElm = editor.dom.getParent(elem, 'figure.image'); + if (figureElm !== null && isFigure(editor, figureElm)) { + return getFigureImg(figureElm); + } else if (isImage(editor, elem)) { + return Optional.some(SugarElement.fromDom(elem)); + } else { + return Optional.none(); + } + }; + var extractFilename = function (editor, url, group) { + var m = url.match(/(?:\/|^)(([^\/\?]+)\.(?:[a-z0-9.]+))(?:\?|$)/i); + return isNonNullable(m) ? editor.dom.encode(m[group]) : null; + }; + var createId = function () { + return 'imagetools' + count++; + }; + var isLocalImage = function (editor, img) { + var url = img.src; + return url.indexOf('data:') === 0 || url.indexOf('blob:') === 0 || new global$4(url).host === editor.documentBaseURI.host; + }; + var isCorsImage = function (editor, img) { + return global$1.inArray(getCorsHosts(editor), new global$4(img.src).host) !== -1; + }; + var isCorsWithCredentialsImage = function (editor, img) { + return global$1.inArray(getCredentialsHosts(editor), new global$4(img.src).host) !== -1; + }; + var defaultFetchImage = function (editor, img) { + if (isCorsImage(editor, img)) { + return getUrl(img.src, null, isCorsWithCredentialsImage(editor, img)); + } + if (!isLocalImage(editor, img)) { + var proxyUrl = getProxyUrl(editor); + var src = proxyUrl + (proxyUrl.indexOf('?') === -1 ? '?' : '&') + 'url=' + encodeURIComponent(img.src); + var apiKey = getApiKey(editor); + return getUrl(src, apiKey, false); + } + return imageToBlob$1(img); + }; + var imageToBlob$2 = function (editor, img) { + return getFetchImage(editor).fold(function () { + return defaultFetchImage(editor, img); + }, function (customFetchImage) { + return customFetchImage(img); + }); + }; + var findBlob = function (editor, img) { + var blobInfo = editor.editorUpload.blobCache.getByUri(img.src); + if (blobInfo) { + return global$3.resolve(blobInfo.blob()); + } + return imageToBlob$2(editor, img); + }; + var startTimedUpload = function (editor, imageUploadTimerState) { + var imageUploadTimer = global$2.setEditorTimeout(editor, function () { + editor.editorUpload.uploadImagesAuto(); + }, getUploadTimeout(editor)); + imageUploadTimerState.set(imageUploadTimer); + }; + var cancelTimedUpload = function (imageUploadTimerState) { + global$2.clearTimeout(imageUploadTimerState.get()); + }; + var updateSelectedImage = function (editor, origBlob, ir, uploadImmediately, imageUploadTimerState, selectedImage, size) { + return ir.toBlob().then(function (blob) { + var uri, name, filename, blobInfo; + var blobCache = editor.editorUpload.blobCache; + uri = selectedImage.src; + var useFilename = origBlob.type === blob.type; + if (shouldReuseFilename(editor)) { + blobInfo = blobCache.getByUri(uri); + if (isNonNullable(blobInfo)) { + uri = blobInfo.uri(); + name = blobInfo.name(); + filename = blobInfo.filename(); + } else { + name = extractFilename(editor, uri, 2); + filename = extractFilename(editor, uri, 1); + } + } + blobInfo = blobCache.create({ + id: createId(), + blob: blob, + base64: ir.toBase64(), + uri: uri, + name: name, + filename: useFilename ? filename : undefined + }); + blobCache.add(blobInfo); + editor.undoManager.transact(function () { + function imageLoadedHandler() { + editor.$(selectedImage).off('load', imageLoadedHandler); + editor.nodeChanged(); + if (uploadImmediately) { + editor.editorUpload.uploadImagesAuto(); + } else { + cancelTimedUpload(imageUploadTimerState); + startTimedUpload(editor, imageUploadTimerState); + } + } + editor.$(selectedImage).on('load', imageLoadedHandler); + if (size) { + editor.$(selectedImage).attr({ + width: size.w, + height: size.h + }); + } + editor.$(selectedImage).attr({ src: blobInfo.blobUri() }).removeAttr('data-mce-src'); + }); + return blobInfo; + }); + }; + var selectedImageOperation = function (editor, imageUploadTimerState, fn, size) { + return function () { + var imgOpt = getSelectedImage(editor); + return imgOpt.fold(function () { + displayError(editor, 'Could not find selected image'); + }, function (img) { + return editor._scanForImages().then(function () { + return findBlob(editor, img.dom); + }).then(function (blob) { + return blobToImageResult(blob).then(fn).then(function (imageResult) { + return updateSelectedImage(editor, blob, imageResult, false, imageUploadTimerState, img.dom, size); + }); + }).catch(function (error) { + displayError(editor, error); + }); + }); + }; + }; + var rotate$2 = function (editor, imageUploadTimerState, angle) { + return function () { + var imgOpt = getSelectedImage(editor); + var flippedSize = imgOpt.fold(function () { + return null; + }, function (img) { + var size = getImageSize(img.dom); + return size ? { + w: size.h, + h: size.w + } : null; + }); + return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) { + return rotate$1(imageResult, angle); + }, flippedSize)(); + }; + }; + var flip$2 = function (editor, imageUploadTimerState, axis) { + return function () { + return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) { + return flip$1(imageResult, axis); + })(); + }; + }; + var handleDialogBlob = function (editor, imageUploadTimerState, img, originalSize, blob) { + return blobToImage$1(blob).then(function (newImage) { + var newSize = getNaturalImageSize(newImage); + if (originalSize.w !== newSize.w || originalSize.h !== newSize.h) { + if (getImageSize(img)) { + setImageSize(img, newSize); + } + } + URL.revokeObjectURL(newImage.src); + return blob; + }).then(blobToImageResult).then(function (imageResult) { + return updateSelectedImage(editor, blob, imageResult, true, imageUploadTimerState, img); + }).catch(function () { + }); + }; + + var saveState = 'save-state'; + var disable = 'disable'; + var enable = 'enable'; + + var createState = function (blob) { + return { + blob: blob, + url: URL.createObjectURL(blob) + }; + }; + var makeOpen = function (editor, imageUploadTimerState) { + return function () { + var getLoadedSpec = function (currentState) { + return { + title: 'Edit Image', + size: 'large', + body: { + type: 'panel', + items: [{ + type: 'imagetools', + name: 'imagetools', + label: 'Edit Image', + currentState: currentState + }] + }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true, + disabled: true + } + ], + onSubmit: function (api) { + var blob = api.getData().imagetools.blob; + originalImgOpt.each(function (originalImg) { + originalSizeOpt.each(function (originalSize) { + handleDialogBlob(editor, imageUploadTimerState, originalImg.dom, originalSize, blob); + }); + }); + api.close(); + }, + onCancel: function () { + }, + onAction: function (api, details) { + switch (details.name) { + case saveState: + if (details.value) { + api.enable('save'); + } else { + api.disable('save'); + } + break; + case disable: + api.disable('save'); + api.disable('cancel'); + break; + case enable: + api.enable('cancel'); + break; + } + } + }; + }; + var originalImgOpt = getSelectedImage(editor); + var originalSizeOpt = originalImgOpt.map(function (origImg) { + return getNaturalImageSize(origImg.dom); + }); + originalImgOpt.each(function (img) { + getEditableImage(editor, img.dom).each(function (_) { + findBlob(editor, img.dom).then(function (blob) { + var state = createState(blob); + editor.windowManager.open(getLoadedSpec(state)); + }); + }); + }); + }; + }; + + var register = function (editor, imageUploadTimerState) { + global$1.each({ + mceImageRotateLeft: rotate$2(editor, imageUploadTimerState, -90), + mceImageRotateRight: rotate$2(editor, imageUploadTimerState, 90), + mceImageFlipVertical: flip$2(editor, imageUploadTimerState, 'v'), + mceImageFlipHorizontal: flip$2(editor, imageUploadTimerState, 'h'), + mceEditImage: makeOpen(editor, imageUploadTimerState) + }, function (fn, cmd) { + editor.addCommand(cmd, fn); + }); + }; + + var setup = function (editor, imageUploadTimerState, lastSelectedImageState) { + editor.on('NodeChange', function (e) { + var lastSelectedImage = lastSelectedImageState.get(); + var selectedImage = getEditableImage(editor, e.element); + if (lastSelectedImage && !selectedImage.exists(function (img) { + return lastSelectedImage.src === img.src; + })) { + cancelTimedUpload(imageUploadTimerState); + editor.editorUpload.uploadImagesAuto(); + lastSelectedImageState.set(null); + } + selectedImage.each(lastSelectedImageState.set); + }); + }; + + var register$1 = function (editor) { + var cmd = function (command) { + return function () { + return editor.execCommand(command); + }; + }; + editor.ui.registry.addButton('rotateleft', { + tooltip: 'Rotate counterclockwise', + icon: 'rotate-left', + onAction: cmd('mceImageRotateLeft') + }); + editor.ui.registry.addButton('rotateright', { + tooltip: 'Rotate clockwise', + icon: 'rotate-right', + onAction: cmd('mceImageRotateRight') + }); + editor.ui.registry.addButton('flipv', { + tooltip: 'Flip vertically', + icon: 'flip-vertically', + onAction: cmd('mceImageFlipVertical') + }); + editor.ui.registry.addButton('fliph', { + tooltip: 'Flip horizontally', + icon: 'flip-horizontally', + onAction: cmd('mceImageFlipHorizontal') + }); + editor.ui.registry.addButton('editimage', { + tooltip: 'Edit image', + icon: 'edit-image', + onAction: cmd('mceEditImage'), + onSetup: function (buttonApi) { + var setDisabled = function () { + var disabled = getSelectedImage(editor).forall(function (element) { + return getEditableImage(editor, element.dom).isNone(); + }); + buttonApi.setDisabled(disabled); + }; + editor.on('NodeChange', setDisabled); + return function () { + editor.off('NodeChange', setDisabled); + }; + } + }); + editor.ui.registry.addButton('imageoptions', { + tooltip: 'Image options', + icon: 'image', + onAction: cmd('mceImage') + }); + editor.ui.registry.addContextMenu('imagetools', { + update: function (element) { + return getEditableImage(editor, element).fold(function () { + return []; + }, function (_) { + return [{ + text: 'Edit image', + icon: 'edit-image', + onAction: cmd('mceEditImage') + }]; + }); + } + }); + }; + + var register$2 = function (editor) { + editor.ui.registry.addContextToolbar('imagetools', { + items: getToolbarItems(editor), + predicate: function (elem) { + return getEditableImage(editor, elem).isSome(); + }, + position: 'node', + scope: 'node' + }); + }; + + function Plugin () { + global.add('imagetools', function (editor) { + var imageUploadTimerState = Cell(0); + var lastSelectedImageState = Cell(null); + register(editor, imageUploadTimerState); + register$1(editor); + register$2(editor); + setup(editor, imageUploadTimerState, lastSelectedImageState); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/imagetools/plugin.min.js b/src/assets/tinymce/plugins/imagetools/plugin.min.js new file mode 100644 index 00000000..8e4fb253 --- /dev/null +++ b/src/assets/tinymce/plugins/imagetools/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var t,e,n,r,l=function(t){var e=t;return{get:function(){return e},set:function(t){e=t}}},o=tinymce.util.Tools.resolve("tinymce.PluginManager"),d=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=function(){},u=function(t){return function(){return t}},a=u(!1),c=u(!0),f=function(){return s},s=(t=function(t){return t.isNone()},{fold:function(t,e){return t()},is:a,isSome:a,isNone:c,getOr:n=function(t){return t},getOrThunk:e=function(t){return t()},getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:u(null),getOrUndefined:u(undefined),or:n,orThunk:e,map:f,each:i,bind:f,exists:a,forall:c,filter:f,equals:t,equals_:t,toArray:function(){return[]},toString:u("none()")}),m=function(n){var t=u(n),e=function(){return o},r=function(t){return t(n)},o={fold:function(t,e){return e(n)},is:function(t){return n===t},isSome:c,isNone:a,getOr:t,getOrThunk:t,getOrDie:t,getOrNull:t,getOrUndefined:t,or:e,orThunk:e,map:function(t){return m(t(n))},each:function(t){t(n)},bind:r,exists:r,forall:r,filter:function(t){return t(n)?o:s},toArray:function(){return[n]},toString:function(){return"some("+n+")"},equals:function(t){return t.is(n)},equals_:function(t,e){return t.fold(a,function(t){return e(n,t)})}};return o},g={some:m,none:f,from:function(t){return null===t||t===undefined?s:m(t)}},h=function(t){return!(null===(e=t)||e===undefined);var e},v=(r="function",function(t){return typeof t===r});function p(t,e){return b(document.createElement("canvas"),t,e)}function y(t){var e=p(t.width,t.height);return w(e).drawImage(t,0,0),e}function w(t){return t.getContext("2d")}function b(t,e,n){return t.width=e,t.height=n,t}var I,T,_,R,U=window.Promise?window.Promise:(I=function(t){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],C(t,A(E,this),A(L,this))},T=window,_=I.immediateFn||"function"==typeof T.setImmediate&&T.setImmediate||function(t){setTimeout(t,1)},R=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},I.prototype["catch"]=function(t){return this.then(null,t)},I.prototype.then=function(n,r){var o=this;return new I(function(t,e){x.call(o,new k(n,r,t,e))})},I.all=function(){for(var t=[],e=0;e 0) { + global$4.each(selectorGroups, function (group) { + var menuItem = processSelector(selector, group); + if (menuItem) { + model.addItemToGroup(group.title, menuItem); + } + }); + } else { + var menuItem = processSelector(selector, null); + if (menuItem) { + model.addItem(menuItem); + } + } + } + } + }); + var items = model.toFormats(); + editor.fire('addStyleModifications', { + items: items, + replace: !shouldAppend(editor) + }); + }); + }; + + var get = function (editor) { + var convertSelectorToFormat = function (selectorText) { + return defaultConvertSelectorToFormat(editor, selectorText); + }; + return { convertSelectorToFormat: convertSelectorToFormat }; + }; + + function Plugin () { + global.add('importcss', function (editor) { + setup(editor); + return get(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/importcss/plugin.min.js b/src/assets/tinymce/plugins/importcss/plugin.min.js new file mode 100644 index 00000000..1c9dab93 --- /dev/null +++ b/src/assets/tinymce/plugins/importcss/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var n,t=tinymce.util.Tools.resolve("tinymce.PluginManager"),v=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),f=tinymce.util.Tools.resolve("tinymce.EditorManager"),m=tinymce.util.Tools.resolve("tinymce.Env"),h=tinymce.util.Tools.resolve("tinymce.util.Tools"),d=function(t){return t.getParam("importcss_selector_converter")},o=(n="array",function(t){return r=typeof(e=t),(null===e?"null":"object"==r&&(Array.prototype.isPrototypeOf(e)||e.constructor&&"Array"===e.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(e)||e.constructor&&"String"===e.constructor.name)?"string":r)===n;var e,r}),i=Array.prototype.push,l=function(t,e){return function(t){for(var e=[],r=0,n=t.length;r 0 ? formats[0] : getTimeFormat(editor); + }; + var shouldInsertTimeElement = function (editor) { + return editor.getParam('insertdatetime_element', false); + }; + + var daysShort = 'Sun Mon Tue Wed Thu Fri Sat Sun'.split(' '); + var daysLong = 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday'.split(' '); + var monthsShort = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' '); + var monthsLong = 'January February March April May June July August September October November December'.split(' '); + var addZeros = function (value, len) { + value = '' + value; + if (value.length < len) { + for (var i = 0; i < len - value.length; i++) { + value = '0' + value; + } + } + return value; + }; + var getDateTime = function (editor, fmt, date) { + date = date || new Date(); + fmt = fmt.replace('%D', '%m/%d/%Y'); + fmt = fmt.replace('%r', '%I:%M:%S %p'); + fmt = fmt.replace('%Y', '' + date.getFullYear()); + fmt = fmt.replace('%y', '' + date.getYear()); + fmt = fmt.replace('%m', addZeros(date.getMonth() + 1, 2)); + fmt = fmt.replace('%d', addZeros(date.getDate(), 2)); + fmt = fmt.replace('%H', '' + addZeros(date.getHours(), 2)); + fmt = fmt.replace('%M', '' + addZeros(date.getMinutes(), 2)); + fmt = fmt.replace('%S', '' + addZeros(date.getSeconds(), 2)); + fmt = fmt.replace('%I', '' + ((date.getHours() + 11) % 12 + 1)); + fmt = fmt.replace('%p', '' + (date.getHours() < 12 ? 'AM' : 'PM')); + fmt = fmt.replace('%B', '' + editor.translate(monthsLong[date.getMonth()])); + fmt = fmt.replace('%b', '' + editor.translate(monthsShort[date.getMonth()])); + fmt = fmt.replace('%A', '' + editor.translate(daysLong[date.getDay()])); + fmt = fmt.replace('%a', '' + editor.translate(daysShort[date.getDay()])); + fmt = fmt.replace('%%', '%'); + return fmt; + }; + var updateElement = function (editor, timeElm, computerTime, userTime) { + var newTimeElm = editor.dom.create('time', { datetime: computerTime }, userTime); + timeElm.parentNode.insertBefore(newTimeElm, timeElm); + editor.dom.remove(timeElm); + editor.selection.select(newTimeElm, true); + editor.selection.collapse(false); + }; + var insertDateTime = function (editor, format) { + if (shouldInsertTimeElement(editor)) { + var userTime = getDateTime(editor, format); + var computerTime = void 0; + if (/%[HMSIp]/.test(format)) { + computerTime = getDateTime(editor, '%Y-%m-%dT%H:%M'); + } else { + computerTime = getDateTime(editor, '%Y-%m-%d'); + } + var timeElm = editor.dom.getParent(editor.selection.getStart(), 'time'); + if (timeElm) { + updateElement(editor, timeElm, computerTime, userTime); + } else { + editor.insertContent(''); + } + } else { + editor.insertContent(getDateTime(editor, format)); + } + }; + + var register = function (editor) { + editor.addCommand('mceInsertDate', function () { + insertDateTime(editor, getDateFormat(editor)); + }); + editor.addCommand('mceInsertTime', function () { + insertDateTime(editor, getTimeFormat(editor)); + }); + }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var register$1 = function (editor) { + var formats = getFormats(editor); + var defaultFormat = Cell(getDefaultDateTime(editor)); + editor.ui.registry.addSplitButton('insertdatetime', { + icon: 'insert-time', + tooltip: 'Insert date/time', + select: function (value) { + return value === defaultFormat.get(); + }, + fetch: function (done) { + done(global$1.map(formats, function (format) { + return { + type: 'choiceitem', + text: getDateTime(editor, format), + value: format + }; + })); + }, + onAction: function (_api) { + insertDateTime(editor, defaultFormat.get()); + }, + onItemAction: function (_api, value) { + defaultFormat.set(value); + insertDateTime(editor, value); + } + }); + var makeMenuItemHandler = function (format) { + return function () { + defaultFormat.set(format); + insertDateTime(editor, format); + }; + }; + editor.ui.registry.addNestedMenuItem('insertdatetime', { + icon: 'insert-time', + text: 'Date/time', + getSubmenuItems: function () { + return global$1.map(formats, function (format) { + return { + type: 'menuitem', + text: getDateTime(editor, format), + onAction: makeMenuItemHandler(format) + }; + }); + } + }); + }; + + function Plugin () { + global.add('insertdatetime', function (editor) { + register(editor); + register$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/insertdatetime/plugin.min.js b/src/assets/tinymce/plugins/insertdatetime/plugin.min.js new file mode 100644 index 00000000..478f4a30 --- /dev/null +++ b/src/assets/tinymce/plugins/insertdatetime/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=function(e){return e.getParam("insertdatetime_timeformat",e.translate("%H:%M:%S"))},c=function(e){return e.getParam("insertdatetime_formats",["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"])},r="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),a="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),i="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),o="January February March April May June July August September October November December".split(" "),m=function(e,t){if((e=""+e).length'+n+"")):e.insertContent(s(e,t))},t=function(t){t.addCommand("mceInsertDate",function(){var e;l(t,(e=t).getParam("insertdatetime_dateformat",e.translate("%Y-%m-%d")))}),t.addCommand("mceInsertTime",function(){l(t,u(t))})},d=tinymce.util.Tools.resolve("tinymce.util.Tools"),n=function(n){var e,t,r,a,i=c(n),o=(a=c(r=n),e=0 -1; + }; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var foldl = function (xs, f, acc) { + each(xs, function (x) { + acc = f(acc, x); + }); + return acc; + }; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var bind = function (xs, f) { + return flatten(map(xs, f)); + }; + var findMap = function (arr, f) { + for (var i = 0; i < arr.length; i++) { + var r = f(arr[i], i); + if (r.isSome()) { + return r; + } + } + return Optional.none(); + }; + + var cat = function (arr) { + var r = []; + var push = function (x) { + r.push(x); + }; + for (var i = 0; i < arr.length; i++) { + arr[i].each(push); + } + return r; + }; + var someIf = function (b, a) { + return b ? Optional.some(a) : Optional.none(); + }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var getValue = function (item) { + return isString(item.value) ? item.value : ''; + }; + var getText = function (item) { + if (isString(item.text)) { + return item.text; + } else if (isString(item.title)) { + return item.title; + } else { + return ''; + } + }; + var sanitizeList = function (list, extractValue) { + var out = []; + global$2.each(list, function (item) { + var text = getText(item); + if (item.menu !== undefined) { + var items = sanitizeList(item.menu, extractValue); + out.push({ + text: text, + items: items + }); + } else { + var value = extractValue(item); + out.push({ + text: text, + value: value + }); + } + }); + return out; + }; + var sanitizeWith = function (extracter) { + if (extracter === void 0) { + extracter = getValue; + } + return function (list) { + return Optional.from(list).map(function (list) { + return sanitizeList(list, extracter); + }); + }; + }; + var sanitize = function (list) { + return sanitizeWith(getValue)(list); + }; + var createUi = function (name, label) { + return function (items) { + return { + name: name, + type: 'listbox', + label: label, + items: items + }; + }; + }; + var ListOptions = { + sanitize: sanitize, + sanitizeWith: sanitizeWith, + createUi: createUi, + getValue: getValue + }; + + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var keys = Object.keys; + var hasOwnProperty = Object.hasOwnProperty; + var each$1 = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + var objAcc = function (r) { + return function (x, i) { + r[i] = x; + }; + }; + var internalFilter = function (obj, pred, onTrue, onFalse) { + var r = {}; + each$1(obj, function (x, i) { + (pred(x, i) ? onTrue : onFalse)(x, i); + }); + return r; + }; + var filter = function (obj, pred) { + var t = {}; + internalFilter(obj, pred, objAcc(t), noop); + return t; + }; + var has = function (obj, key) { + return hasOwnProperty.call(obj, key); + }; + var hasNonNullableKey = function (obj, key) { + return has(obj, key) && obj[key] !== undefined && obj[key] !== null; + }; + + var global$3 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker'); + + var isAnchor = function (elm) { + return elm && elm.nodeName.toLowerCase() === 'a'; + }; + var isLink = function (elm) { + return isAnchor(elm) && !!getHref(elm); + }; + var collectNodesInRange = function (rng, predicate) { + if (rng.collapsed) { + return []; + } else { + var contents = rng.cloneContents(); + var walker = new global$3(contents.firstChild, contents); + var elements = []; + var current = contents.firstChild; + do { + if (predicate(current)) { + elements.push(current); + } + } while (current = walker.next()); + return elements; + } + }; + var hasProtocol = function (url) { + return /^\w+:/i.test(url); + }; + var getHref = function (elm) { + var href = elm.getAttribute('data-mce-href'); + return href ? href : elm.getAttribute('href'); + }; + var applyRelTargetRules = function (rel, isUnsafe) { + var rules = ['noopener']; + var rels = rel ? rel.split(/\s+/) : []; + var toString = function (rels) { + return global$2.trim(rels.sort().join(' ')); + }; + var addTargetRules = function (rels) { + rels = removeTargetRules(rels); + return rels.length > 0 ? rels.concat(rules) : rules; + }; + var removeTargetRules = function (rels) { + return rels.filter(function (val) { + return global$2.inArray(rules, val) === -1; + }); + }; + var newRels = isUnsafe ? addTargetRules(rels) : removeTargetRules(rels); + return newRels.length > 0 ? toString(newRels) : ''; + }; + var trimCaretContainers = function (text) { + return text.replace(/\uFEFF/g, ''); + }; + var getAnchorElement = function (editor, selectedElm) { + selectedElm = selectedElm || editor.selection.getNode(); + if (isImageFigure(selectedElm)) { + return editor.dom.select('a[href]', selectedElm)[0]; + } else { + return editor.dom.getParent(selectedElm, 'a[href]'); + } + }; + var getAnchorText = function (selection, anchorElm) { + var text = anchorElm ? anchorElm.innerText || anchorElm.textContent : selection.getContent({ format: 'text' }); + return trimCaretContainers(text); + }; + var hasLinks = function (elements) { + return global$2.grep(elements, isLink).length > 0; + }; + var hasLinksInSelection = function (rng) { + return collectNodesInRange(rng, isLink).length > 0; + }; + var isOnlyTextSelected = function (editor) { + var inlineTextElements = editor.schema.getTextInlineElements(); + var isElement = function (elm) { + return elm.nodeType === 1 && !isAnchor(elm) && !has(inlineTextElements, elm.nodeName.toLowerCase()); + }; + var elements = collectNodesInRange(editor.selection.getRng(), isElement); + return elements.length === 0; + }; + var isImageFigure = function (elm) { + return elm && elm.nodeName === 'FIGURE' && /\bimage\b/i.test(elm.className); + }; + var getLinkAttrs = function (data) { + return foldl([ + 'title', + 'rel', + 'class', + 'target' + ], function (acc, key) { + data[key].each(function (value) { + acc[key] = value.length > 0 ? value : null; + }); + return acc; + }, { href: data.href }); + }; + var handleExternalTargets = function (href, assumeExternalTargets) { + if ((assumeExternalTargets === 'http' || assumeExternalTargets === 'https') && !hasProtocol(href)) { + return assumeExternalTargets + '://' + href; + } + return href; + }; + var applyLinkOverrides = function (editor, linkAttrs) { + var newLinkAttrs = __assign({}, linkAttrs); + if (!(getRelList(editor).length > 0) && allowUnsafeLinkTarget(editor) === false) { + var newRel = applyRelTargetRules(newLinkAttrs.rel, newLinkAttrs.target === '_blank'); + newLinkAttrs.rel = newRel ? newRel : null; + } + if (Optional.from(newLinkAttrs.target).isNone() && getTargetList(editor) === false) { + newLinkAttrs.target = getDefaultLinkTarget(editor); + } + newLinkAttrs.href = handleExternalTargets(newLinkAttrs.href, assumeExternalTargets(editor)); + return newLinkAttrs; + }; + var updateLink = function (editor, anchorElm, text, linkAttrs) { + text.each(function (text) { + if (anchorElm.hasOwnProperty('innerText')) { + anchorElm.innerText = text; + } else { + anchorElm.textContent = text; + } + }); + editor.dom.setAttribs(anchorElm, linkAttrs); + editor.selection.select(anchorElm); + }; + var createLink = function (editor, selectedElm, text, linkAttrs) { + if (isImageFigure(selectedElm)) { + linkImageFigure(editor, selectedElm, linkAttrs); + } else { + text.fold(function () { + editor.execCommand('mceInsertLink', false, linkAttrs); + }, function (text) { + editor.insertContent(editor.dom.createHTML('a', linkAttrs, editor.dom.encode(text))); + }); + } + }; + var linkDomMutation = function (editor, attachState, data) { + var selectedElm = editor.selection.getNode(); + var anchorElm = getAnchorElement(editor, selectedElm); + var linkAttrs = applyLinkOverrides(editor, getLinkAttrs(data)); + editor.undoManager.transact(function () { + if (data.href === attachState.href) { + attachState.attach(); + } + if (anchorElm) { + editor.focus(); + updateLink(editor, anchorElm, data.text, linkAttrs); + } else { + createLink(editor, selectedElm, data.text, linkAttrs); + } + }); + }; + var unlinkSelection = function (editor) { + var dom = editor.dom, selection = editor.selection; + var bookmark = selection.getBookmark(); + var rng = selection.getRng().cloneRange(); + var startAnchorElm = dom.getParent(rng.startContainer, 'a[href]', editor.getBody()); + var endAnchorElm = dom.getParent(rng.endContainer, 'a[href]', editor.getBody()); + if (startAnchorElm) { + rng.setStartBefore(startAnchorElm); + } + if (endAnchorElm) { + rng.setEndAfter(endAnchorElm); + } + selection.setRng(rng); + editor.execCommand('unlink'); + selection.moveToBookmark(bookmark); + }; + var unlinkDomMutation = function (editor) { + editor.undoManager.transact(function () { + var node = editor.selection.getNode(); + if (isImageFigure(node)) { + unlinkImageFigure(editor, node); + } else { + unlinkSelection(editor); + } + editor.focus(); + }); + }; + var unwrapOptions = function (data) { + var cls = data.class, href = data.href, rel = data.rel, target = data.target, text = data.text, title = data.title; + return filter({ + class: cls.getOrNull(), + href: href, + rel: rel.getOrNull(), + target: target.getOrNull(), + text: text.getOrNull(), + title: title.getOrNull() + }, function (v, _k) { + return isNull(v) === false; + }); + }; + var link = function (editor, attachState, data) { + editor.hasPlugin('rtc', true) ? editor.execCommand('createlink', false, unwrapOptions(data)) : linkDomMutation(editor, attachState, data); + }; + var unlink = function (editor) { + editor.hasPlugin('rtc', true) ? editor.execCommand('unlink') : unlinkDomMutation(editor); + }; + var unlinkImageFigure = function (editor, fig) { + var img = editor.dom.select('img', fig)[0]; + if (img) { + var a = editor.dom.getParents(img, 'a[href]', fig)[0]; + if (a) { + a.parentNode.insertBefore(img, a); + editor.dom.remove(a); + } + } + }; + var linkImageFigure = function (editor, fig, attrs) { + var img = editor.dom.select('img', fig)[0]; + if (img) { + var a = editor.dom.create('a', attrs); + img.parentNode.insertBefore(a, img); + a.appendChild(img); + } + }; + + var isListGroup = function (item) { + return hasNonNullableKey(item, 'items'); + }; + var findTextByValue = function (value, catalog) { + return findMap(catalog, function (item) { + if (isListGroup(item)) { + return findTextByValue(value, item.items); + } else { + return someIf(item.value === value, item); + } + }); + }; + var getDelta = function (persistentText, fieldName, catalog, data) { + var value = data[fieldName]; + var hasPersistentText = persistentText.length > 0; + return value !== undefined ? findTextByValue(value, catalog).map(function (i) { + return { + url: { + value: i.value, + meta: { + text: hasPersistentText ? persistentText : i.text, + attach: noop + } + }, + text: hasPersistentText ? persistentText : i.text + }; + }) : Optional.none(); + }; + var findCatalog = function (catalogs, fieldName) { + if (fieldName === 'link') { + return catalogs.link; + } else if (fieldName === 'anchor') { + return catalogs.anchor; + } else { + return Optional.none(); + } + }; + var init = function (initialData, linkCatalog) { + var persistentData = { + text: initialData.text, + title: initialData.title + }; + var getTitleFromUrlChange = function (url) { + return someIf(persistentData.title.length <= 0, Optional.from(url.meta.title).getOr('')); + }; + var getTextFromUrlChange = function (url) { + return someIf(persistentData.text.length <= 0, Optional.from(url.meta.text).getOr(url.value)); + }; + var onUrlChange = function (data) { + var text = getTextFromUrlChange(data.url); + var title = getTitleFromUrlChange(data.url); + if (text.isSome() || title.isSome()) { + return Optional.some(__assign(__assign({}, text.map(function (text) { + return { text: text }; + }).getOr({})), title.map(function (title) { + return { title: title }; + }).getOr({}))); + } else { + return Optional.none(); + } + }; + var onCatalogChange = function (data, change) { + var catalog = findCatalog(linkCatalog, change.name).getOr([]); + return getDelta(persistentData.text, change.name, catalog, data); + }; + var onChange = function (getData, change) { + var name = change.name; + if (name === 'url') { + return onUrlChange(getData()); + } else if (contains([ + 'anchor', + 'link' + ], name)) { + return onCatalogChange(getData(), change); + } else if (name === 'text' || name === 'title') { + persistentData[name] = getData()[name]; + return Optional.none(); + } else { + return Optional.none(); + } + }; + return { onChange: onChange }; + }; + var DialogChanges = { + init: init, + getDelta: getDelta + }; + + var global$4 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var global$5 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var delayedConfirm = function (editor, message, callback) { + var rng = editor.selection.getRng(); + global$4.setEditorTimeout(editor, function () { + editor.windowManager.confirm(message, function (state) { + editor.selection.setRng(rng); + callback(state); + }); + }); + }; + var tryEmailTransform = function (data) { + var url = data.href; + var suggestMailTo = url.indexOf('@') > 0 && url.indexOf('/') === -1 && url.indexOf('mailto:') === -1; + return suggestMailTo ? Optional.some({ + message: 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?', + preprocess: function (oldData) { + return __assign(__assign({}, oldData), { href: 'mailto:' + url }); + } + }) : Optional.none(); + }; + var tryProtocolTransform = function (assumeExternalTargets, defaultLinkProtocol) { + return function (data) { + var url = data.href; + var suggestProtocol = assumeExternalTargets === 1 && !hasProtocol(url) || assumeExternalTargets === 0 && /^\s*www(\.|\d\.)/i.test(url); + return suggestProtocol ? Optional.some({ + message: 'The URL you entered seems to be an external link. Do you want to add the required ' + defaultLinkProtocol + ':// prefix?', + preprocess: function (oldData) { + return __assign(__assign({}, oldData), { href: defaultLinkProtocol + '://' + url }); + } + }) : Optional.none(); + }; + }; + var preprocess = function (editor, data) { + return findMap([ + tryEmailTransform, + tryProtocolTransform(assumeExternalTargets(editor), getDefaultLinkProtocol(editor)) + ], function (f) { + return f(data); + }).fold(function () { + return global$5.resolve(data); + }, function (transform) { + return new global$5(function (callback) { + delayedConfirm(editor, transform.message, function (state) { + callback(state ? transform.preprocess(data) : data); + }); + }); + }); + }; + var DialogConfirms = { preprocess: preprocess }; + + var getAnchors = function (editor) { + var anchorNodes = editor.dom.select('a:not([href])'); + var anchors = bind(anchorNodes, function (anchor) { + var id = anchor.name || anchor.id; + return id ? [{ + text: id, + value: '#' + id + }] : []; + }); + return anchors.length > 0 ? Optional.some([{ + text: 'None', + value: '' + }].concat(anchors)) : Optional.none(); + }; + var AnchorListOptions = { getAnchors: getAnchors }; + + var getClasses = function (editor) { + var list = getLinkClassList(editor); + if (list.length > 0) { + return ListOptions.sanitize(list); + } + return Optional.none(); + }; + var ClassListOptions = { getClasses: getClasses }; + + var global$6 = tinymce.util.Tools.resolve('tinymce.util.XHR'); + + var parseJson = function (text) { + try { + return Optional.some(JSON.parse(text)); + } catch (err) { + return Optional.none(); + } + }; + var getLinks = function (editor) { + var extractor = function (item) { + return editor.convertURL(item.value || item.url, 'href'); + }; + var linkList = getLinkList(editor); + return new global$5(function (callback) { + if (isString(linkList)) { + global$6.send({ + url: linkList, + success: function (text) { + return callback(parseJson(text)); + }, + error: function (_) { + return callback(Optional.none()); + } + }); + } else if (isFunction(linkList)) { + linkList(function (output) { + return callback(Optional.some(output)); + }); + } else { + callback(Optional.from(linkList)); + } + }).then(function (optItems) { + return optItems.bind(ListOptions.sanitizeWith(extractor)).map(function (items) { + if (items.length > 0) { + var noneItem = [{ + text: 'None', + value: '' + }]; + return noneItem.concat(items); + } else { + return items; + } + }); + }); + }; + var LinkListOptions = { getLinks: getLinks }; + + var getRels = function (editor, initialTarget) { + var list = getRelList(editor); + if (list.length > 0) { + var isTargetBlank_1 = initialTarget.is('_blank'); + var enforceSafe = allowUnsafeLinkTarget(editor) === false; + var safeRelExtractor = function (item) { + return applyRelTargetRules(ListOptions.getValue(item), isTargetBlank_1); + }; + var sanitizer = enforceSafe ? ListOptions.sanitizeWith(safeRelExtractor) : ListOptions.sanitize; + return sanitizer(list); + } + return Optional.none(); + }; + var RelOptions = { getRels: getRels }; + + var fallbacks = [ + { + text: 'Current window', + value: '' + }, + { + text: 'New window', + value: '_blank' + } + ]; + var getTargets = function (editor) { + var list = getTargetList(editor); + if (isArray(list)) { + return ListOptions.sanitize(list).orThunk(function () { + return Optional.some(fallbacks); + }); + } else if (list === false) { + return Optional.none(); + } + return Optional.some(fallbacks); + }; + var TargetOptions = { getTargets: getTargets }; + + var nonEmptyAttr = function (dom, elem, name) { + var val = dom.getAttrib(elem, name); + return val !== null && val.length > 0 ? Optional.some(val) : Optional.none(); + }; + var extractFromAnchor = function (editor, anchor) { + var dom = editor.dom; + var onlyText = isOnlyTextSelected(editor); + var text = onlyText ? Optional.some(getAnchorText(editor.selection, anchor)) : Optional.none(); + var url = anchor ? Optional.some(dom.getAttrib(anchor, 'href')) : Optional.none(); + var target = anchor ? Optional.from(dom.getAttrib(anchor, 'target')) : Optional.none(); + var rel = nonEmptyAttr(dom, anchor, 'rel'); + var linkClass = nonEmptyAttr(dom, anchor, 'class'); + var title = nonEmptyAttr(dom, anchor, 'title'); + return { + url: url, + text: text, + title: title, + target: target, + rel: rel, + linkClass: linkClass + }; + }; + var collect = function (editor, linkNode) { + return LinkListOptions.getLinks(editor).then(function (links) { + var anchor = extractFromAnchor(editor, linkNode); + return { + anchor: anchor, + catalogs: { + targets: TargetOptions.getTargets(editor), + rels: RelOptions.getRels(editor, anchor.target), + classes: ClassListOptions.getClasses(editor), + anchor: AnchorListOptions.getAnchors(editor), + link: links + }, + optNode: Optional.from(linkNode), + flags: { titleEnabled: shouldShowLinkTitle(editor) } + }; + }); + }; + var DialogInfo = { collect: collect }; + + var handleSubmit = function (editor, info) { + return function (api) { + var data = api.getData(); + if (!data.url.value) { + unlink(editor); + api.close(); + return; + } + var getChangedValue = function (key) { + return Optional.from(data[key]).filter(function (value) { + return !info.anchor[key].is(value); + }); + }; + var changedData = { + href: data.url.value, + text: getChangedValue('text'), + target: getChangedValue('target'), + rel: getChangedValue('rel'), + class: getChangedValue('linkClass'), + title: getChangedValue('title') + }; + var attachState = { + href: data.url.value, + attach: data.url.meta !== undefined && data.url.meta.attach ? data.url.meta.attach : function () { + } + }; + DialogConfirms.preprocess(editor, changedData).then(function (pData) { + link(editor, attachState, pData); + }); + api.close(); + }; + }; + var collectData = function (editor) { + var anchorNode = getAnchorElement(editor); + return DialogInfo.collect(editor, anchorNode); + }; + var getInitialData = function (info, defaultTarget) { + var anchor = info.anchor; + var url = anchor.url.getOr(''); + return { + url: { + value: url, + meta: { original: { value: url } } + }, + text: anchor.text.getOr(''), + title: anchor.title.getOr(''), + anchor: url, + link: url, + rel: anchor.rel.getOr(''), + target: anchor.target.or(defaultTarget).getOr(''), + linkClass: anchor.linkClass.getOr('') + }; + }; + var makeDialog = function (settings, onSubmit, editor) { + var urlInput = [{ + name: 'url', + type: 'urlinput', + filetype: 'file', + label: 'URL' + }]; + var displayText = settings.anchor.text.map(function () { + return { + name: 'text', + type: 'input', + label: 'Text to display' + }; + }).toArray(); + var titleText = settings.flags.titleEnabled ? [{ + name: 'title', + type: 'input', + label: 'Title' + }] : []; + var defaultTarget = Optional.from(getDefaultLinkTarget(editor)); + var initialData = getInitialData(settings, defaultTarget); + var catalogs = settings.catalogs; + var dialogDelta = DialogChanges.init(initialData, catalogs); + var body = { + type: 'panel', + items: flatten([ + urlInput, + displayText, + titleText, + cat([ + catalogs.anchor.map(ListOptions.createUi('anchor', 'Anchors')), + catalogs.rels.map(ListOptions.createUi('rel', 'Rel')), + catalogs.targets.map(ListOptions.createUi('target', 'Open link in...')), + catalogs.link.map(ListOptions.createUi('link', 'Link list')), + catalogs.classes.map(ListOptions.createUi('linkClass', 'Class')) + ]) + ]) + }; + return { + title: 'Insert/Edit Link', + size: 'normal', + body: body, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: initialData, + onChange: function (api, _a) { + var name = _a.name; + dialogDelta.onChange(api.getData, { name: name }).each(function (newData) { + api.setData(newData); + }); + }, + onSubmit: onSubmit + }; + }; + var open = function (editor) { + var data = collectData(editor); + data.then(function (info) { + var onSubmit = handleSubmit(editor, info); + return makeDialog(info, onSubmit, editor); + }).then(function (spec) { + editor.windowManager.open(spec); + }); + }; + + var appendClickRemove = function (link, evt) { + document.body.appendChild(link); + link.dispatchEvent(evt); + document.body.removeChild(link); + }; + var open$1 = function (url) { + var link = document.createElement('a'); + link.target = '_blank'; + link.href = url; + link.rel = 'noreferrer noopener'; + var evt = document.createEvent('MouseEvents'); + evt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); + appendClickRemove(link, evt); + }; + + var getLink = function (editor, elm) { + return editor.dom.getParent(elm, 'a[href]'); + }; + var getSelectedLink = function (editor) { + return getLink(editor, editor.selection.getStart()); + }; + var hasOnlyAltModifier = function (e) { + return e.altKey === true && e.shiftKey === false && e.ctrlKey === false && e.metaKey === false; + }; + var gotoLink = function (editor, a) { + if (a) { + var href = getHref(a); + if (/^#/.test(href)) { + var targetEl = editor.$(href); + if (targetEl.length) { + editor.selection.scrollIntoView(targetEl[0], true); + } + } else { + open$1(a.href); + } + } + }; + var openDialog = function (editor) { + return function () { + open(editor); + }; + }; + var gotoSelectedLink = function (editor) { + return function () { + gotoLink(editor, getSelectedLink(editor)); + }; + }; + var setupGotoLinks = function (editor) { + editor.on('click', function (e) { + var link = getLink(editor, e.target); + if (link && global$1.metaKeyPressed(e)) { + e.preventDefault(); + gotoLink(editor, link); + } + }); + editor.on('keydown', function (e) { + var link = getSelectedLink(editor); + if (link && e.keyCode === 13 && hasOnlyAltModifier(e)) { + e.preventDefault(); + gotoLink(editor, link); + } + }); + }; + var toggleState = function (editor, toggler) { + editor.on('NodeChange', toggler); + return function () { + return editor.off('NodeChange', toggler); + }; + }; + var toggleActiveState = function (editor) { + return function (api) { + return toggleState(editor, function () { + api.setActive(!editor.mode.isReadOnly() && getAnchorElement(editor, editor.selection.getNode()) !== null); + }); + }; + }; + var toggleEnabledState = function (editor) { + return function (api) { + var updateState = function () { + return api.setDisabled(getAnchorElement(editor, editor.selection.getNode()) === null); + }; + updateState(); + return toggleState(editor, updateState); + }; + }; + var toggleUnlinkState = function (editor) { + return function (api) { + var hasLinks$1 = function (parents) { + return hasLinks(parents) || hasLinksInSelection(editor.selection.getRng()); + }; + var parents = editor.dom.getParents(editor.selection.getStart()); + api.setDisabled(!hasLinks$1(parents)); + return toggleState(editor, function (e) { + return api.setDisabled(!hasLinks$1(e.parents)); + }); + }; + }; + + var register = function (editor) { + editor.addCommand('mceLink', function () { + if (useQuickLink(editor)) { + editor.fire('contexttoolbar-show', { toolbarKey: 'quicklink' }); + } else { + openDialog(editor)(); + } + }); + }; + + var setup = function (editor) { + editor.addShortcut('Meta+K', '', function () { + editor.execCommand('mceLink'); + }); + }; + + var setupButtons = function (editor) { + editor.ui.registry.addToggleButton('link', { + icon: 'link', + tooltip: 'Insert/edit link', + onAction: openDialog(editor), + onSetup: toggleActiveState(editor) + }); + editor.ui.registry.addButton('openlink', { + icon: 'new-tab', + tooltip: 'Open link', + onAction: gotoSelectedLink(editor), + onSetup: toggleEnabledState(editor) + }); + editor.ui.registry.addButton('unlink', { + icon: 'unlink', + tooltip: 'Remove link', + onAction: function () { + return unlink(editor); + }, + onSetup: toggleUnlinkState(editor) + }); + }; + var setupMenuItems = function (editor) { + editor.ui.registry.addMenuItem('openlink', { + text: 'Open link', + icon: 'new-tab', + onAction: gotoSelectedLink(editor), + onSetup: toggleEnabledState(editor) + }); + editor.ui.registry.addMenuItem('link', { + icon: 'link', + text: 'Link...', + shortcut: 'Meta+K', + onAction: openDialog(editor) + }); + editor.ui.registry.addMenuItem('unlink', { + icon: 'unlink', + text: 'Remove link', + onAction: function () { + return unlink(editor); + }, + onSetup: toggleUnlinkState(editor) + }); + }; + var setupContextMenu = function (editor) { + var inLink = 'link unlink openlink'; + var noLink = 'link'; + editor.ui.registry.addContextMenu('link', { + update: function (element) { + return hasLinks(editor.dom.getParents(element, 'a')) ? inLink : noLink; + } + }); + }; + var setupContextToolbars = function (editor) { + var collapseSelectionToEnd = function (editor) { + editor.selection.collapse(false); + }; + var onSetupLink = function (buttonApi) { + var node = editor.selection.getNode(); + buttonApi.setDisabled(!getAnchorElement(editor, node)); + return function () { + }; + }; + editor.ui.registry.addContextForm('quicklink', { + launch: { + type: 'contextformtogglebutton', + icon: 'link', + tooltip: 'Link', + onSetup: toggleActiveState(editor) + }, + label: 'Link', + predicate: function (node) { + return !!getAnchorElement(editor, node) && hasContextToolbar(editor); + }, + initValue: function () { + var elm = getAnchorElement(editor); + return !!elm ? getHref(elm) : ''; + }, + commands: [ + { + type: 'contextformtogglebutton', + icon: 'link', + tooltip: 'Link', + primary: true, + onSetup: function (buttonApi) { + var node = editor.selection.getNode(); + buttonApi.setActive(!!getAnchorElement(editor, node)); + return toggleActiveState(editor)(buttonApi); + }, + onAction: function (formApi) { + var anchor = getAnchorElement(editor); + var value = formApi.getValue(); + if (!anchor) { + var attachState = { + href: value, + attach: function () { + } + }; + var onlyText = isOnlyTextSelected(editor); + var text = onlyText ? Optional.some(getAnchorText(editor.selection, anchor)).filter(function (t) { + return t.length > 0; + }).or(Optional.from(value)) : Optional.none(); + link(editor, attachState, { + href: value, + text: text, + title: Optional.none(), + rel: Optional.none(), + target: Optional.none(), + class: Optional.none() + }); + formApi.hide(); + } else { + editor.undoManager.transact(function () { + editor.dom.setAttrib(anchor, 'href', value); + collapseSelectionToEnd(editor); + formApi.hide(); + }); + } + } + }, + { + type: 'contextformbutton', + icon: 'unlink', + tooltip: 'Remove link', + onSetup: onSetupLink, + onAction: function (formApi) { + unlink(editor); + formApi.hide(); + } + }, + { + type: 'contextformbutton', + icon: 'new-tab', + tooltip: 'Open link', + onSetup: onSetupLink, + onAction: function (formApi) { + gotoSelectedLink(editor)(); + formApi.hide(); + } + } + ] + }); + }; + + function Plugin () { + global.add('link', function (editor) { + setupButtons(editor); + setupMenuItems(editor); + setupContextMenu(editor); + setupContextToolbars(editor); + setupGotoLinks(editor); + register(editor); + setup(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/link/plugin.min.js b/src/assets/tinymce/plugins/link/plugin.min.js new file mode 100644 index 00000000..bf458688 --- /dev/null +++ b/src/assets/tinymce/plugins/link/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var n,t,e,r,o=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=tinymce.util.Tools.resolve("tinymce.util.VK"),u=function(r){return function(t){return e=typeof(n=t),(null===n?"null":"object"==e&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==e&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":e)===r;var n,e}},a=function(n){return function(t){return typeof t===n}},l=u("string"),c=u("array"),f=function(t){return n===t},s=a("boolean"),m=a("function"),g=function(t){var n=t.getParam("link_assume_external_targets",!1);return s(n)&&n?1:!l(n)||"http"!==n&&"https"!==n?0:n},p=function(t){return t.getParam("default_link_target")},d=function(t){return t.getParam("target_list",!0)},h=function(t){return t.getParam("rel_list",[],"array")},v=function(t){return t.getParam("allow_unsafe_link_target",!1,"boolean")},y=function(){},k=function(t){return function(){return t}},x=k(!1),b=k(!(n=null)),O=function(){return w},w=(t=function(t){return t.isNone()},{fold:function(t,n){return t()},is:x,isSome:x,isNone:b,getOr:r=function(t){return t},getOrThunk:e=function(t){return t()},getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:k(null),getOrUndefined:k(undefined),or:r,orThunk:e,map:O,each:y,bind:O,exists:x,forall:b,filter:O,equals:t,equals_:t,toArray:function(){return[]},toString:k("none()")}),C=function(e){var t=k(e),n=function(){return o},r=function(t){return t(e)},o={fold:function(t,n){return n(e)},is:function(t){return e===t},isSome:b,isNone:x,getOr:t,getOrThunk:t,getOrDie:t,getOrNull:t,getOrUndefined:t,or:n,orThunk:n,map:function(t){return C(t(e))},each:function(t){t(e)},bind:r,exists:r,forall:r,filter:function(t){return t(e)?o:w},toArray:function(){return[e]},toString:function(){return"some("+e+")"},equals:function(t){return t.is(e)},equals_:function(t,n){return t.fold(x,function(t){return n(e,t)})}};return o},N={some:C,none:O,from:function(t){return null===t||t===undefined?w:C(t)}},A=Array.prototype.indexOf,P=Array.prototype.push,T=function(t,n){return e=t,r=n,-1= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); + }; + var head = function (xs) { + return get(xs, 0); + }; + var last = function (xs) { + return get(xs, xs.length - 1); + }; + + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var cached = function (f) { + var called = false; + var r; + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (!called) { + called = true; + r = f.apply(null, args); + } + return r; + }; + }; + + var DeviceType = function (os, browser, userAgent, mediaMatch) { + var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true; + var isiPhone = os.isiOS() && !isiPad; + var isMobile = os.isiOS() || os.isAndroid(); + var isTouch = isMobile || mediaMatch('(pointer:coarse)'); + var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)'); + var isPhone = isiPhone || isMobile && !isTablet; + var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false; + var isDesktop = !isPhone && !isTablet && !iOSwebview; + return { + isiPad: constant(isiPad), + isiPhone: constant(isiPhone), + isTablet: constant(isTablet), + isPhone: constant(isPhone), + isTouch: constant(isTouch), + isAndroid: os.isAndroid, + isiOS: os.isiOS, + isWebView: constant(iOSwebview), + isDesktop: constant(isDesktop) + }; + }; + + var firstMatch = function (regexes, s) { + for (var i = 0; i < regexes.length; i++) { + var x = regexes[i]; + if (x.test(s)) { + return x; + } + } + return undefined; + }; + var find$1 = function (regexes, agent) { + var r = firstMatch(regexes, agent); + if (!r) { + return { + major: 0, + minor: 0 + }; + } + var group = function (i) { + return Number(agent.replace(r, '$' + i)); + }; + return nu(group(1), group(2)); + }; + var detect = function (versionRegexes, agent) { + var cleanedAgent = String(agent).toLowerCase(); + if (versionRegexes.length === 0) { + return unknown(); + } + return find$1(versionRegexes, cleanedAgent); + }; + var unknown = function () { + return nu(0, 0); + }; + var nu = function (major, minor) { + return { + major: major, + minor: minor + }; + }; + var Version = { + nu: nu, + detect: detect, + unknown: unknown + }; + + var detect$1 = function (candidates, userAgent) { + var agent = String(userAgent).toLowerCase(); + return find(candidates, function (candidate) { + return candidate.search(agent); + }); + }; + var detectBrowser = function (browsers, userAgent) { + return detect$1(browsers, userAgent).map(function (browser) { + var version = Version.detect(browser.versionRegexes, userAgent); + return { + current: browser.name, + version: version + }; + }); + }; + var detectOs = function (oses, userAgent) { + return detect$1(oses, userAgent).map(function (os) { + var version = Version.detect(os.versionRegexes, userAgent); + return { + current: os.name, + version: version + }; + }); + }; + var UaString = { + detectBrowser: detectBrowser, + detectOs: detectOs + }; + + var contains = function (str, substr) { + return str.indexOf(substr) !== -1; + }; + + var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/; + var checkContains = function (target) { + return function (uastring) { + return contains(uastring, target); + }; + }; + var browsers = [ + { + name: 'Edge', + versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/], + search: function (uastring) { + return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit'); + } + }, + { + name: 'Chrome', + versionRegexes: [ + /.*?chrome\/([0-9]+)\.([0-9]+).*/, + normalVersionRegex + ], + search: function (uastring) { + return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe'); + } + }, + { + name: 'IE', + versionRegexes: [ + /.*?msie\ ?([0-9]+)\.([0-9]+).*/, + /.*?rv:([0-9]+)\.([0-9]+).*/ + ], + search: function (uastring) { + return contains(uastring, 'msie') || contains(uastring, 'trident'); + } + }, + { + name: 'Opera', + versionRegexes: [ + normalVersionRegex, + /.*?opera\/([0-9]+)\.([0-9]+).*/ + ], + search: checkContains('opera') + }, + { + name: 'Firefox', + versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/], + search: checkContains('firefox') + }, + { + name: 'Safari', + versionRegexes: [ + normalVersionRegex, + /.*?cpu os ([0-9]+)_([0-9]+).*/ + ], + search: function (uastring) { + return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit'); + } + } + ]; + var oses = [ + { + name: 'Windows', + search: checkContains('win'), + versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/] + }, + { + name: 'iOS', + search: function (uastring) { + return contains(uastring, 'iphone') || contains(uastring, 'ipad'); + }, + versionRegexes: [ + /.*?version\/\ ?([0-9]+)\.([0-9]+).*/, + /.*cpu os ([0-9]+)_([0-9]+).*/, + /.*cpu iphone os ([0-9]+)_([0-9]+).*/ + ] + }, + { + name: 'Android', + search: checkContains('android'), + versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/] + }, + { + name: 'OSX', + search: checkContains('mac os x'), + versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/] + }, + { + name: 'Linux', + search: checkContains('linux'), + versionRegexes: [] + }, + { + name: 'Solaris', + search: checkContains('sunos'), + versionRegexes: [] + }, + { + name: 'FreeBSD', + search: checkContains('freebsd'), + versionRegexes: [] + }, + { + name: 'ChromeOS', + search: checkContains('cros'), + versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/] + } + ]; + var PlatformInfo = { + browsers: constant(browsers), + oses: constant(oses) + }; + + var edge = 'Edge'; + var chrome = 'Chrome'; + var ie = 'IE'; + var opera = 'Opera'; + var firefox = 'Firefox'; + var safari = 'Safari'; + var unknown$1 = function () { + return nu$1({ + current: undefined, + version: Version.unknown() + }); + }; + var nu$1 = function (info) { + var current = info.current; + var version = info.version; + var isBrowser = function (name) { + return function () { + return current === name; + }; + }; + return { + current: current, + version: version, + isEdge: isBrowser(edge), + isChrome: isBrowser(chrome), + isIE: isBrowser(ie), + isOpera: isBrowser(opera), + isFirefox: isBrowser(firefox), + isSafari: isBrowser(safari) + }; + }; + var Browser = { + unknown: unknown$1, + nu: nu$1, + edge: constant(edge), + chrome: constant(chrome), + ie: constant(ie), + opera: constant(opera), + firefox: constant(firefox), + safari: constant(safari) + }; + + var windows = 'Windows'; + var ios = 'iOS'; + var android = 'Android'; + var linux = 'Linux'; + var osx = 'OSX'; + var solaris = 'Solaris'; + var freebsd = 'FreeBSD'; + var chromeos = 'ChromeOS'; + var unknown$2 = function () { + return nu$2({ + current: undefined, + version: Version.unknown() + }); + }; + var nu$2 = function (info) { + var current = info.current; + var version = info.version; + var isOS = function (name) { + return function () { + return current === name; + }; + }; + return { + current: current, + version: version, + isWindows: isOS(windows), + isiOS: isOS(ios), + isAndroid: isOS(android), + isOSX: isOS(osx), + isLinux: isOS(linux), + isSolaris: isOS(solaris), + isFreeBSD: isOS(freebsd), + isChromeOS: isOS(chromeos) + }; + }; + var OperatingSystem = { + unknown: unknown$2, + nu: nu$2, + windows: constant(windows), + ios: constant(ios), + android: constant(android), + linux: constant(linux), + osx: constant(osx), + solaris: constant(solaris), + freebsd: constant(freebsd), + chromeos: constant(chromeos) + }; + + var detect$2 = function (userAgent, mediaMatch) { + var browsers = PlatformInfo.browsers(); + var oses = PlatformInfo.oses(); + var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu); + var os = UaString.detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu); + var deviceType = DeviceType(os, browser, userAgent, mediaMatch); + return { + browser: browser, + os: os, + deviceType: deviceType + }; + }; + var PlatformDetection = { detect: detect$2 }; + + var mediaMatch = function (query) { + return window.matchMedia(query).matches; + }; + var platform = cached(function () { + return PlatformDetection.detect(navigator.userAgent, mediaMatch); + }); + var detect$3 = function () { + return platform(); + }; + + var compareDocumentPosition = function (a, b, match) { + return (a.compareDocumentPosition(b) & match) !== 0; + }; + var documentPositionContainedBy = function (a, b) { + return compareDocumentPosition(a, b, Node.DOCUMENT_POSITION_CONTAINED_BY); + }; + + var ELEMENT = 1; + + var fromHtml = function (html, scope) { + var doc = scope || document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: node }; + }; + var fromPoint = function (docElm, x, y) { + return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); + }; + var SugarElement = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var is = function (element, selector) { + var dom = element.dom; + if (dom.nodeType !== ELEMENT) { + return false; + } else { + var elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } + }; + + var eq = function (e1, e2) { + return e1.dom === e2.dom; + }; + var regularContains = function (e1, e2) { + var d1 = e1.dom; + var d2 = e2.dom; + return d1 === d2 ? false : d1.contains(d2); + }; + var ieContains = function (e1, e2) { + return documentPositionContainedBy(e1.dom, e2.dom); + }; + var contains$1 = function (e1, e2) { + return detect$3().browser.isIE() ? ieContains(e1, e2) : regularContains(e1, e2); + }; + var is$1 = is; + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.RangeUtils'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.VK'); + + var keys = Object.keys; + var each$1 = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + var objAcc = function (r) { + return function (x, i) { + r[i] = x; + }; + }; + var internalFilter = function (obj, pred, onTrue, onFalse) { + var r = {}; + each$1(obj, function (x, i) { + (pred(x, i) ? onTrue : onFalse)(x, i); + }); + return r; + }; + var filter$1 = function (obj, pred) { + var t = {}; + internalFilter(obj, pred, objAcc(t), noop); + return t; + }; + + var Global = typeof window !== 'undefined' ? window : Function('return this;')(); + + var name = function (element) { + var r = element.dom.nodeName; + return r.toLowerCase(); + }; + var type = function (element) { + return element.dom.nodeType; + }; + var isType$1 = function (t) { + return function (element) { + return type(element) === t; + }; + }; + var isElement = isType$1(ELEMENT); + + var rawSet = function (dom, key, value) { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + var setAll = function (element, attrs) { + var dom = element.dom; + each$1(attrs, function (v, k) { + rawSet(dom, k, v); + }); + }; + var clone = function (element) { + return foldl(element.dom.attributes, function (acc, attr) { + acc[attr.name] = attr.value; + return acc; + }, {}); + }; + + var parent = function (element) { + return Optional.from(element.dom.parentNode).map(SugarElement.fromDom); + }; + var children = function (element) { + return map(element.dom.childNodes, SugarElement.fromDom); + }; + var child = function (element, index) { + var cs = element.dom.childNodes; + return Optional.from(cs[index]).map(SugarElement.fromDom); + }; + var firstChild = function (element) { + return child(element, 0); + }; + var lastChild = function (element) { + return child(element, element.dom.childNodes.length - 1); + }; + + var before = function (marker, element) { + var parent$1 = parent(marker); + parent$1.each(function (v) { + v.dom.insertBefore(element.dom, marker.dom); + }); + }; + var append = function (parent, element) { + parent.dom.appendChild(element.dom); + }; + + var before$1 = function (marker, elements) { + each(elements, function (x) { + before(marker, x); + }); + }; + var append$1 = function (parent, elements) { + each(elements, function (x) { + append(parent, x); + }); + }; + + var remove = function (element) { + var dom = element.dom; + if (dom.parentNode !== null) { + dom.parentNode.removeChild(dom); + } + }; + + var clone$1 = function (original, isDeep) { + return SugarElement.fromDom(original.dom.cloneNode(isDeep)); + }; + var deep = function (original) { + return clone$1(original, true); + }; + var shallowAs = function (original, tag) { + var nu = SugarElement.fromTag(tag); + var attributes = clone(original); + setAll(nu, attributes); + return nu; + }; + var mutate = function (original, tag) { + var nu = shallowAs(original, tag); + before(original, nu); + var children$1 = children(original); + append$1(nu, children$1); + remove(original); + return nu; + }; + + var global$4 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var global$5 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var matchNodeName = function (name) { + return function (node) { + return node && node.nodeName.toLowerCase() === name; + }; + }; + var matchNodeNames = function (regex) { + return function (node) { + return node && regex.test(node.nodeName); + }; + }; + var isTextNode = function (node) { + return node && node.nodeType === 3; + }; + var isListNode = matchNodeNames(/^(OL|UL|DL)$/); + var isOlUlNode = matchNodeNames(/^(OL|UL)$/); + var isOlNode = matchNodeName('ol'); + var isListItemNode = matchNodeNames(/^(LI|DT|DD)$/); + var isDlItemNode = matchNodeNames(/^(DT|DD)$/); + var isTableCellNode = matchNodeNames(/^(TH|TD)$/); + var isBr = matchNodeName('br'); + var isFirstChild = function (node) { + return node.parentNode.firstChild === node; + }; + var isTextBlock = function (editor, node) { + return node && !!editor.schema.getTextBlockElements()[node.nodeName]; + }; + var isBlock = function (node, blockElements) { + return node && node.nodeName in blockElements; + }; + var isBogusBr = function (dom, node) { + if (!isBr(node)) { + return false; + } + return dom.isBlock(node.nextSibling) && !isBr(node.previousSibling); + }; + var isEmpty = function (dom, elm, keepBookmarks) { + var empty = dom.isEmpty(elm); + if (keepBookmarks && dom.select('span[data-mce-type=bookmark]', elm).length > 0) { + return false; + } + return empty; + }; + var isChildOfBody = function (dom, elm) { + return dom.isChildOf(elm, dom.getRoot()); + }; + + var shouldIndentOnTab = function (editor) { + return editor.getParam('lists_indent_on_tab', true); + }; + var getForcedRootBlock = function (editor) { + var block = editor.getParam('forced_root_block', 'p'); + if (block === false) { + return ''; + } else if (block === true) { + return 'p'; + } else { + return block; + } + }; + var getForcedRootBlockAttrs = function (editor) { + return editor.getParam('forced_root_block_attrs', {}); + }; + + var createTextBlock = function (editor, contentNode) { + var dom = editor.dom; + var blockElements = editor.schema.getBlockElements(); + var fragment = dom.createFragment(); + var blockName = getForcedRootBlock(editor); + var node, textBlock, hasContentNode; + if (blockName) { + textBlock = dom.create(blockName); + if (textBlock.tagName === blockName.toUpperCase()) { + dom.setAttribs(textBlock, getForcedRootBlockAttrs(editor)); + } + if (!isBlock(contentNode.firstChild, blockElements)) { + fragment.appendChild(textBlock); + } + } + if (contentNode) { + while (node = contentNode.firstChild) { + var nodeName = node.nodeName; + if (!hasContentNode && (nodeName !== 'SPAN' || node.getAttribute('data-mce-type') !== 'bookmark')) { + hasContentNode = true; + } + if (isBlock(node, blockElements)) { + fragment.appendChild(node); + textBlock = null; + } else { + if (blockName) { + if (!textBlock) { + textBlock = dom.create(blockName); + fragment.appendChild(textBlock); + } + textBlock.appendChild(node); + } else { + fragment.appendChild(node); + } + } + } + } + if (!blockName) { + fragment.appendChild(dom.create('br')); + } else { + if (!hasContentNode) { + textBlock.appendChild(dom.create('br', { 'data-mce-bogus': '1' })); + } + } + return fragment; + }; + + var DOM = global$4.DOM; + var splitList = function (editor, ul, li) { + var removeAndKeepBookmarks = function (targetNode) { + global$5.each(bookmarks, function (node) { + targetNode.parentNode.insertBefore(node, li.parentNode); + }); + DOM.remove(targetNode); + }; + var bookmarks = DOM.select('span[data-mce-type="bookmark"]', ul); + var newBlock = createTextBlock(editor, li); + var tmpRng = DOM.createRng(); + tmpRng.setStartAfter(li); + tmpRng.setEndAfter(ul); + var fragment = tmpRng.extractContents(); + for (var node = fragment.firstChild; node; node = node.firstChild) { + if (node.nodeName === 'LI' && editor.dom.isEmpty(node)) { + DOM.remove(node); + break; + } + } + if (!editor.dom.isEmpty(fragment)) { + DOM.insertAfter(fragment, ul); + } + DOM.insertAfter(newBlock, ul); + if (isEmpty(editor.dom, li.parentNode)) { + removeAndKeepBookmarks(li.parentNode); + } + DOM.remove(li); + if (isEmpty(editor.dom, ul)) { + DOM.remove(ul); + } + }; + + var outdentDlItem = function (editor, item) { + if (is$1(item, 'dd')) { + mutate(item, 'dt'); + } else if (is$1(item, 'dt')) { + parent(item).each(function (dl) { + return splitList(editor, dl.dom, item.dom); + }); + } + }; + var indentDlItem = function (item) { + if (is$1(item, 'dt')) { + mutate(item, 'dd'); + } + }; + var dlIndentation = function (editor, indentation, dlItems) { + if (indentation === 'Indent') { + each(dlItems, indentDlItem); + } else { + each(dlItems, function (item) { + return outdentDlItem(editor, item); + }); + } + }; + + var getNormalizedPoint = function (container, offset) { + if (isTextNode(container)) { + return { + container: container, + offset: offset + }; + } + var node = global$1.getNode(container, offset); + if (isTextNode(node)) { + return { + container: node, + offset: offset >= container.childNodes.length ? node.data.length : 0 + }; + } else if (node.previousSibling && isTextNode(node.previousSibling)) { + return { + container: node.previousSibling, + offset: node.previousSibling.data.length + }; + } else if (node.nextSibling && isTextNode(node.nextSibling)) { + return { + container: node.nextSibling, + offset: 0 + }; + } + return { + container: container, + offset: offset + }; + }; + var normalizeRange = function (rng) { + var outRng = rng.cloneRange(); + var rangeStart = getNormalizedPoint(rng.startContainer, rng.startOffset); + outRng.setStart(rangeStart.container, rangeStart.offset); + var rangeEnd = getNormalizedPoint(rng.endContainer, rng.endOffset); + outRng.setEnd(rangeEnd.container, rangeEnd.offset); + return outRng; + }; + + var global$6 = tinymce.util.Tools.resolve('tinymce.dom.DomQuery'); + + var getParentList = function (editor, node) { + var selectionStart = node || editor.selection.getStart(true); + return editor.dom.getParent(selectionStart, 'OL,UL,DL', getClosestListRootElm(editor, selectionStart)); + }; + var isParentListSelected = function (parentList, selectedBlocks) { + return parentList && selectedBlocks.length === 1 && selectedBlocks[0] === parentList; + }; + var findSubLists = function (parentList) { + return global$5.grep(parentList.querySelectorAll('ol,ul,dl'), function (elm) { + return isListNode(elm); + }); + }; + var getSelectedSubLists = function (editor) { + var parentList = getParentList(editor); + var selectedBlocks = editor.selection.getSelectedBlocks(); + if (isParentListSelected(parentList, selectedBlocks)) { + return findSubLists(parentList); + } else { + return global$5.grep(selectedBlocks, function (elm) { + return isListNode(elm) && parentList !== elm; + }); + } + }; + var findParentListItemsNodes = function (editor, elms) { + var listItemsElms = global$5.map(elms, function (elm) { + var parentLi = editor.dom.getParent(elm, 'li,dd,dt', getClosestListRootElm(editor, elm)); + return parentLi ? parentLi : elm; + }); + return global$6.unique(listItemsElms); + }; + var getSelectedListItems = function (editor) { + var selectedBlocks = editor.selection.getSelectedBlocks(); + return global$5.grep(findParentListItemsNodes(editor, selectedBlocks), function (block) { + return isListItemNode(block); + }); + }; + var getSelectedDlItems = function (editor) { + return filter(getSelectedListItems(editor), isDlItemNode); + }; + var getClosestListRootElm = function (editor, elm) { + var parentTableCell = editor.dom.getParents(elm, 'TD,TH'); + var root = parentTableCell.length > 0 ? parentTableCell[0] : editor.getBody(); + return root; + }; + var findLastParentListNode = function (editor, elm) { + var parentLists = editor.dom.getParents(elm, 'ol,ul', getClosestListRootElm(editor, elm)); + return last(parentLists); + }; + var getSelectedLists = function (editor) { + var firstList = findLastParentListNode(editor, editor.selection.getStart()); + var subsequentLists = filter(editor.selection.getSelectedBlocks(), isOlUlNode); + return firstList.toArray().concat(subsequentLists); + }; + var getSelectedListRoots = function (editor) { + var selectedLists = getSelectedLists(editor); + return getUniqueListRoots(editor, selectedLists); + }; + var getUniqueListRoots = function (editor, lists) { + var listRoots = map(lists, function (list) { + return findLastParentListNode(editor, list).getOr(list); + }); + return global$6.unique(listRoots); + }; + + var lift2 = function (oa, ob, f) { + return oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none(); + }; + + var fromElements = function (elements, scope) { + var doc = scope || document; + var fragment = doc.createDocumentFragment(); + each(elements, function (element) { + fragment.appendChild(element.dom); + }); + return SugarElement.fromDom(fragment); + }; + + var fireListEvent = function (editor, action, element) { + return editor.fire('ListMutation', { + action: action, + element: element + }); + }; + + var isSupported = function (dom) { + return dom.style !== undefined && isFunction(dom.style.getPropertyValue); + }; + + var internalSet = function (dom, property, value) { + if (!isString(value)) { + console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); + throw new Error('CSS value must be a string: ' + value); + } + if (isSupported(dom)) { + dom.style.setProperty(property, value); + } + }; + var set = function (element, property, value) { + var dom = element.dom; + internalSet(dom, property, value); + }; + + var joinSegment = function (parent, child) { + append(parent.item, child.list); + }; + var joinSegments = function (segments) { + for (var i = 1; i < segments.length; i++) { + joinSegment(segments[i - 1], segments[i]); + } + }; + var appendSegments = function (head$1, tail) { + lift2(last(head$1), head(tail), joinSegment); + }; + var createSegment = function (scope, listType) { + var segment = { + list: SugarElement.fromTag(listType, scope), + item: SugarElement.fromTag('li', scope) + }; + append(segment.list, segment.item); + return segment; + }; + var createSegments = function (scope, entry, size) { + var segments = []; + for (var i = 0; i < size; i++) { + segments.push(createSegment(scope, entry.listType)); + } + return segments; + }; + var populateSegments = function (segments, entry) { + for (var i = 0; i < segments.length - 1; i++) { + set(segments[i].item, 'list-style-type', 'none'); + } + last(segments).each(function (segment) { + setAll(segment.list, entry.listAttributes); + setAll(segment.item, entry.itemAttributes); + append$1(segment.item, entry.content); + }); + }; + var normalizeSegment = function (segment, entry) { + if (name(segment.list) !== entry.listType) { + segment.list = mutate(segment.list, entry.listType); + } + setAll(segment.list, entry.listAttributes); + }; + var createItem = function (scope, attr, content) { + var item = SugarElement.fromTag('li', scope); + setAll(item, attr); + append$1(item, content); + return item; + }; + var appendItem = function (segment, item) { + append(segment.list, item); + segment.item = item; + }; + var writeShallow = function (scope, cast, entry) { + var newCast = cast.slice(0, entry.depth); + last(newCast).each(function (segment) { + var item = createItem(scope, entry.itemAttributes, entry.content); + appendItem(segment, item); + normalizeSegment(segment, entry); + }); + return newCast; + }; + var writeDeep = function (scope, cast, entry) { + var segments = createSegments(scope, entry, entry.depth - cast.length); + joinSegments(segments); + populateSegments(segments, entry); + appendSegments(cast, segments); + return cast.concat(segments); + }; + var composeList = function (scope, entries) { + var cast = foldl(entries, function (cast, entry) { + return entry.depth > cast.length ? writeDeep(scope, cast, entry) : writeShallow(scope, cast, entry); + }, []); + return head(cast).map(function (segment) { + return segment.list; + }); + }; + + var isList = function (el) { + return is$1(el, 'OL,UL'); + }; + var hasFirstChildList = function (el) { + return firstChild(el).map(isList).getOr(false); + }; + var hasLastChildList = function (el) { + return lastChild(el).map(isList).getOr(false); + }; + + var isIndented = function (entry) { + return entry.depth > 0; + }; + var isSelected = function (entry) { + return entry.isSelected; + }; + var cloneItemContent = function (li) { + var children$1 = children(li); + var content = hasLastChildList(li) ? children$1.slice(0, -1) : children$1; + return map(content, deep); + }; + var createEntry = function (li, depth, isSelected) { + return parent(li).filter(isElement).map(function (list) { + return { + depth: depth, + dirty: false, + isSelected: isSelected, + content: cloneItemContent(li), + itemAttributes: clone(li), + listAttributes: clone(list), + listType: name(list) + }; + }); + }; + + var indentEntry = function (indentation, entry) { + switch (indentation) { + case 'Indent': + entry.depth++; + break; + case 'Outdent': + entry.depth--; + break; + case 'Flatten': + entry.depth = 0; + } + entry.dirty = true; + }; + + var cloneListProperties = function (target, source) { + target.listType = source.listType; + target.listAttributes = __assign({}, source.listAttributes); + }; + var cleanListProperties = function (entry) { + entry.listAttributes = filter$1(entry.listAttributes, function (_value, key) { + return key !== 'start'; + }); + }; + var closestSiblingEntry = function (entries, start) { + var depth = entries[start].depth; + var matches = function (entry) { + return entry.depth === depth && !entry.dirty; + }; + var until = function (entry) { + return entry.depth < depth; + }; + return findUntil(reverse(entries.slice(0, start)), matches, until).orThunk(function () { + return findUntil(entries.slice(start + 1), matches, until); + }); + }; + var normalizeEntries = function (entries) { + each(entries, function (entry, i) { + closestSiblingEntry(entries, i).fold(function () { + if (entry.dirty) { + cleanListProperties(entry); + } + }, function (matchingEntry) { + return cloneListProperties(entry, matchingEntry); + }); + }); + return entries; + }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var parseItem = function (depth, itemSelection, selectionState, item) { + return firstChild(item).filter(isList).fold(function () { + itemSelection.each(function (selection) { + if (eq(selection.start, item)) { + selectionState.set(true); + } + }); + var currentItemEntry = createEntry(item, depth, selectionState.get()); + itemSelection.each(function (selection) { + if (eq(selection.end, item)) { + selectionState.set(false); + } + }); + var childListEntries = lastChild(item).filter(isList).map(function (list) { + return parseList(depth, itemSelection, selectionState, list); + }).getOr([]); + return currentItemEntry.toArray().concat(childListEntries); + }, function (list) { + return parseList(depth, itemSelection, selectionState, list); + }); + }; + var parseList = function (depth, itemSelection, selectionState, list) { + return bind(children(list), function (element) { + var parser = isList(element) ? parseList : parseItem; + var newDepth = depth + 1; + return parser(newDepth, itemSelection, selectionState, element); + }); + }; + var parseLists = function (lists, itemSelection) { + var selectionState = Cell(false); + var initialDepth = 0; + return map(lists, function (list) { + return { + sourceList: list, + entries: parseList(initialDepth, itemSelection, selectionState, list) + }; + }); + }; + + var outdentedComposer = function (editor, entries) { + var normalizedEntries = normalizeEntries(entries); + return map(normalizedEntries, function (entry) { + var content = fromElements(entry.content); + return SugarElement.fromDom(createTextBlock(editor, content.dom)); + }); + }; + var indentedComposer = function (editor, entries) { + var normalizedEntries = normalizeEntries(entries); + return composeList(editor.contentDocument, normalizedEntries).toArray(); + }; + var composeEntries = function (editor, entries) { + return bind(groupBy(entries, isIndented), function (entries) { + var groupIsIndented = head(entries).map(isIndented).getOr(false); + return groupIsIndented ? indentedComposer(editor, entries) : outdentedComposer(editor, entries); + }); + }; + var indentSelectedEntries = function (entries, indentation) { + each(filter(entries, isSelected), function (entry) { + return indentEntry(indentation, entry); + }); + }; + var getItemSelection = function (editor) { + var selectedListItems = map(getSelectedListItems(editor), SugarElement.fromDom); + return lift2(find(selectedListItems, not(hasFirstChildList)), find(reverse(selectedListItems), not(hasFirstChildList)), function (start, end) { + return { + start: start, + end: end + }; + }); + }; + var listIndentation = function (editor, lists, indentation) { + var entrySets = parseLists(lists, getItemSelection(editor)); + each(entrySets, function (entrySet) { + indentSelectedEntries(entrySet.entries, indentation); + var composedLists = composeEntries(editor, entrySet.entries); + each(composedLists, function (composedList) { + fireListEvent(editor, indentation === 'Indent' ? 'IndentList' : 'OutdentList', composedList.dom); + }); + before$1(entrySet.sourceList, composedLists); + remove(entrySet.sourceList); + }); + }; + + var selectionIndentation = function (editor, indentation) { + var lists = map(getSelectedListRoots(editor), SugarElement.fromDom); + var dlItems = map(getSelectedDlItems(editor), SugarElement.fromDom); + var isHandled = false; + if (lists.length || dlItems.length) { + var bookmark = editor.selection.getBookmark(); + listIndentation(editor, lists, indentation); + dlIndentation(editor, indentation, dlItems); + editor.selection.moveToBookmark(bookmark); + editor.selection.setRng(normalizeRange(editor.selection.getRng())); + editor.nodeChanged(); + isHandled = true; + } + return isHandled; + }; + var indentListSelection = function (editor) { + return selectionIndentation(editor, 'Indent'); + }; + var outdentListSelection = function (editor) { + return selectionIndentation(editor, 'Outdent'); + }; + var flattenListSelection = function (editor) { + return selectionIndentation(editor, 'Flatten'); + }; + + var global$7 = tinymce.util.Tools.resolve('tinymce.dom.BookmarkManager'); + + var DOM$1 = global$4.DOM; + var createBookmark = function (rng) { + var bookmark = {}; + var setupEndPoint = function (start) { + var offsetNode, container, offset; + container = rng[start ? 'startContainer' : 'endContainer']; + offset = rng[start ? 'startOffset' : 'endOffset']; + if (container.nodeType === 1) { + offsetNode = DOM$1.create('span', { 'data-mce-type': 'bookmark' }); + if (container.hasChildNodes()) { + offset = Math.min(offset, container.childNodes.length - 1); + if (start) { + container.insertBefore(offsetNode, container.childNodes[offset]); + } else { + DOM$1.insertAfter(offsetNode, container.childNodes[offset]); + } + } else { + container.appendChild(offsetNode); + } + container = offsetNode; + offset = 0; + } + bookmark[start ? 'startContainer' : 'endContainer'] = container; + bookmark[start ? 'startOffset' : 'endOffset'] = offset; + }; + setupEndPoint(true); + if (!rng.collapsed) { + setupEndPoint(); + } + return bookmark; + }; + var resolveBookmark = function (bookmark) { + function restoreEndPoint(start) { + var container, offset, node; + var nodeIndex = function (container) { + var node = container.parentNode.firstChild, idx = 0; + while (node) { + if (node === container) { + return idx; + } + if (node.nodeType !== 1 || node.getAttribute('data-mce-type') !== 'bookmark') { + idx++; + } + node = node.nextSibling; + } + return -1; + }; + container = node = bookmark[start ? 'startContainer' : 'endContainer']; + offset = bookmark[start ? 'startOffset' : 'endOffset']; + if (!container) { + return; + } + if (container.nodeType === 1) { + offset = nodeIndex(container); + container = container.parentNode; + DOM$1.remove(node); + if (!container.hasChildNodes() && DOM$1.isBlock(container)) { + container.appendChild(DOM$1.create('br')); + } + } + bookmark[start ? 'startContainer' : 'endContainer'] = container; + bookmark[start ? 'startOffset' : 'endOffset'] = offset; + } + restoreEndPoint(true); + restoreEndPoint(); + var rng = DOM$1.createRng(); + rng.setStart(bookmark.startContainer, bookmark.startOffset); + if (bookmark.endContainer) { + rng.setEnd(bookmark.endContainer, bookmark.endOffset); + } + return normalizeRange(rng); + }; + + var listToggleActionFromListName = function (listName) { + switch (listName) { + case 'UL': + return 'ToggleUlList'; + case 'OL': + return 'ToggleOlList'; + case 'DL': + return 'ToggleDLList'; + } + }; + + var isCustomList = function (list) { + return /\btox\-/.test(list.className); + }; + var listState = function (editor, listName, activate) { + var nodeChangeHandler = function (e) { + var inList = findUntil(e.parents, isListNode, isTableCellNode).filter(function (list) { + return list.nodeName === listName && !isCustomList(list); + }).isSome(); + activate(inList); + }; + var parents = editor.dom.getParents(editor.selection.getNode()); + nodeChangeHandler({ parents: parents }); + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }; + + var updateListStyle = function (dom, el, detail) { + var type = detail['list-style-type'] ? detail['list-style-type'] : null; + dom.setStyle(el, 'list-style-type', type); + }; + var setAttribs = function (elm, attrs) { + global$5.each(attrs, function (value, key) { + elm.setAttribute(key, value); + }); + }; + var updateListAttrs = function (dom, el, detail) { + setAttribs(el, detail['list-attributes']); + global$5.each(dom.select('li', el), function (li) { + setAttribs(li, detail['list-item-attributes']); + }); + }; + var updateListWithDetails = function (dom, el, detail) { + updateListStyle(dom, el, detail); + updateListAttrs(dom, el, detail); + }; + var removeStyles = function (dom, element, styles) { + global$5.each(styles, function (style) { + var _a; + return dom.setStyle(element, (_a = {}, _a[style] = '', _a)); + }); + }; + var getEndPointNode = function (editor, rng, start, root) { + var container = rng[start ? 'startContainer' : 'endContainer']; + var offset = rng[start ? 'startOffset' : 'endOffset']; + if (container.nodeType === 1) { + container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container; + } + if (!start && isBr(container.nextSibling)) { + container = container.nextSibling; + } + while (container.parentNode !== root) { + if (isTextBlock(editor, container)) { + return container; + } + if (/^(TD|TH)$/.test(container.parentNode.nodeName)) { + return container; + } + container = container.parentNode; + } + return container; + }; + var getSelectedTextBlocks = function (editor, rng, root) { + var textBlocks = [], dom = editor.dom; + var startNode = getEndPointNode(editor, rng, true, root); + var endNode = getEndPointNode(editor, rng, false, root); + var block; + var siblings = []; + for (var node = startNode; node; node = node.nextSibling) { + siblings.push(node); + if (node === endNode) { + break; + } + } + global$5.each(siblings, function (node) { + if (isTextBlock(editor, node)) { + textBlocks.push(node); + block = null; + return; + } + if (dom.isBlock(node) || isBr(node)) { + if (isBr(node)) { + dom.remove(node); + } + block = null; + return; + } + var nextSibling = node.nextSibling; + if (global$7.isBookmarkNode(node)) { + if (isTextBlock(editor, nextSibling) || !nextSibling && node.parentNode === root) { + block = null; + return; + } + } + if (!block) { + block = dom.create('p'); + node.parentNode.insertBefore(block, node); + textBlocks.push(block); + } + block.appendChild(node); + }); + return textBlocks; + }; + var hasCompatibleStyle = function (dom, sib, detail) { + var sibStyle = dom.getStyle(sib, 'list-style-type'); + var detailStyle = detail ? detail['list-style-type'] : ''; + detailStyle = detailStyle === null ? '' : detailStyle; + return sibStyle === detailStyle; + }; + var applyList = function (editor, listName, detail) { + if (detail === void 0) { + detail = {}; + } + var rng = editor.selection.getRng(); + var listItemName = 'LI'; + var root = getClosestListRootElm(editor, editor.selection.getStart(true)); + var dom = editor.dom; + if (dom.getContentEditable(editor.selection.getNode()) === 'false') { + return; + } + listName = listName.toUpperCase(); + if (listName === 'DL') { + listItemName = 'DT'; + } + var bookmark = createBookmark(rng); + global$5.each(getSelectedTextBlocks(editor, rng, root), function (block) { + var listBlock; + var sibling = block.previousSibling; + if (sibling && isListNode(sibling) && sibling.nodeName === listName && hasCompatibleStyle(dom, sibling, detail)) { + listBlock = sibling; + block = dom.rename(block, listItemName); + sibling.appendChild(block); + } else { + listBlock = dom.create(listName); + block.parentNode.insertBefore(listBlock, block); + listBlock.appendChild(block); + block = dom.rename(block, listItemName); + } + removeStyles(dom, block, [ + 'margin', + 'margin-right', + 'margin-bottom', + 'margin-left', + 'margin-top', + 'padding', + 'padding-right', + 'padding-bottom', + 'padding-left', + 'padding-top' + ]); + updateListWithDetails(dom, listBlock, detail); + mergeWithAdjacentLists(editor.dom, listBlock); + }); + editor.selection.setRng(resolveBookmark(bookmark)); + }; + var isValidLists = function (list1, list2) { + return list1 && list2 && isListNode(list1) && list1.nodeName === list2.nodeName; + }; + var hasSameListStyle = function (dom, list1, list2) { + var targetStyle = dom.getStyle(list1, 'list-style-type', true); + var style = dom.getStyle(list2, 'list-style-type', true); + return targetStyle === style; + }; + var hasSameClasses = function (elm1, elm2) { + return elm1.className === elm2.className; + }; + var shouldMerge = function (dom, list1, list2) { + return isValidLists(list1, list2) && hasSameListStyle(dom, list1, list2) && hasSameClasses(list1, list2); + }; + var mergeWithAdjacentLists = function (dom, listBlock) { + var sibling, node; + sibling = listBlock.nextSibling; + if (shouldMerge(dom, listBlock, sibling)) { + while (node = sibling.firstChild) { + listBlock.appendChild(node); + } + dom.remove(sibling); + } + sibling = listBlock.previousSibling; + if (shouldMerge(dom, listBlock, sibling)) { + while (node = sibling.lastChild) { + listBlock.insertBefore(node, listBlock.firstChild); + } + dom.remove(sibling); + } + }; + var updateList = function (editor, list, listName, detail) { + if (list.nodeName !== listName) { + var newList = editor.dom.rename(list, listName); + updateListWithDetails(editor.dom, newList, detail); + fireListEvent(editor, listToggleActionFromListName(listName), newList); + } else { + updateListWithDetails(editor.dom, list, detail); + fireListEvent(editor, listToggleActionFromListName(listName), list); + } + }; + var toggleMultipleLists = function (editor, parentList, lists, listName, detail) { + if (parentList.nodeName === listName && !hasListStyleDetail(detail)) { + flattenListSelection(editor); + } else { + var bookmark = createBookmark(editor.selection.getRng(true)); + global$5.each([parentList].concat(lists), function (elm) { + updateList(editor, elm, listName, detail); + }); + editor.selection.setRng(resolveBookmark(bookmark)); + } + }; + var hasListStyleDetail = function (detail) { + return 'list-style-type' in detail; + }; + var toggleSingleList = function (editor, parentList, listName, detail) { + if (parentList === editor.getBody()) { + return; + } + if (parentList) { + if (parentList.nodeName === listName && !hasListStyleDetail(detail) && !isCustomList(parentList)) { + flattenListSelection(editor); + } else { + var bookmark = createBookmark(editor.selection.getRng(true)); + updateListWithDetails(editor.dom, parentList, detail); + var newList = editor.dom.rename(parentList, listName); + mergeWithAdjacentLists(editor.dom, newList); + editor.selection.setRng(resolveBookmark(bookmark)); + fireListEvent(editor, listToggleActionFromListName(listName), newList); + } + } else { + applyList(editor, listName, detail); + fireListEvent(editor, listToggleActionFromListName(listName), parentList); + } + }; + var toggleList = function (editor, listName, detail) { + var parentList = getParentList(editor); + var selectedSubLists = getSelectedSubLists(editor); + detail = detail ? detail : {}; + if (parentList && selectedSubLists.length > 0) { + toggleMultipleLists(editor, parentList, selectedSubLists, listName, detail); + } else { + toggleSingleList(editor, parentList, listName, detail); + } + }; + + var DOM$2 = global$4.DOM; + var normalizeList = function (dom, ul) { + var sibling; + var parentNode = ul.parentNode; + if (parentNode.nodeName === 'LI' && parentNode.firstChild === ul) { + sibling = parentNode.previousSibling; + if (sibling && sibling.nodeName === 'LI') { + sibling.appendChild(ul); + if (isEmpty(dom, parentNode)) { + DOM$2.remove(parentNode); + } + } else { + DOM$2.setStyle(parentNode, 'listStyleType', 'none'); + } + } + if (isListNode(parentNode)) { + sibling = parentNode.previousSibling; + if (sibling && sibling.nodeName === 'LI') { + sibling.appendChild(ul); + } + } + }; + var normalizeLists = function (dom, element) { + global$5.each(global$5.grep(dom.select('ol,ul', element)), function (ul) { + normalizeList(dom, ul); + }); + }; + + var findNextCaretContainer = function (editor, rng, isForward, root) { + var node = rng.startContainer; + var offset = rng.startOffset; + if (isTextNode(node) && (isForward ? offset < node.data.length : offset > 0)) { + return node; + } + var nonEmptyBlocks = editor.schema.getNonEmptyElements(); + if (node.nodeType === 1) { + node = global$1.getNode(node, offset); + } + var walker = new global$2(node, root); + if (isForward) { + if (isBogusBr(editor.dom, node)) { + walker.next(); + } + } + while (node = walker[isForward ? 'next' : 'prev2']()) { + if (node.nodeName === 'LI' && !node.hasChildNodes()) { + return node; + } + if (nonEmptyBlocks[node.nodeName]) { + return node; + } + if (isTextNode(node) && node.data.length > 0) { + return node; + } + } + }; + var hasOnlyOneBlockChild = function (dom, elm) { + var childNodes = elm.childNodes; + return childNodes.length === 1 && !isListNode(childNodes[0]) && dom.isBlock(childNodes[0]); + }; + var unwrapSingleBlockChild = function (dom, elm) { + if (hasOnlyOneBlockChild(dom, elm)) { + dom.remove(elm.firstChild, true); + } + }; + var moveChildren = function (dom, fromElm, toElm) { + var node; + var targetElm = hasOnlyOneBlockChild(dom, toElm) ? toElm.firstChild : toElm; + unwrapSingleBlockChild(dom, fromElm); + if (!isEmpty(dom, fromElm, true)) { + while (node = fromElm.firstChild) { + targetElm.appendChild(node); + } + } + }; + var mergeLiElements = function (dom, fromElm, toElm) { + var listNode; + var ul = fromElm.parentNode; + if (!isChildOfBody(dom, fromElm) || !isChildOfBody(dom, toElm)) { + return; + } + if (isListNode(toElm.lastChild)) { + listNode = toElm.lastChild; + } + if (ul === toElm.lastChild) { + if (isBr(ul.previousSibling)) { + dom.remove(ul.previousSibling); + } + } + var node = toElm.lastChild; + if (node && isBr(node) && fromElm.hasChildNodes()) { + dom.remove(node); + } + if (isEmpty(dom, toElm, true)) { + dom.$(toElm).empty(); + } + moveChildren(dom, fromElm, toElm); + if (listNode) { + toElm.appendChild(listNode); + } + var contains = contains$1(SugarElement.fromDom(toElm), SugarElement.fromDom(fromElm)); + var nestedLists = contains ? dom.getParents(fromElm, isListNode, toElm) : []; + dom.remove(fromElm); + each(nestedLists, function (list) { + if (isEmpty(dom, list) && list !== dom.getRoot()) { + dom.remove(list); + } + }); + }; + var mergeIntoEmptyLi = function (editor, fromLi, toLi) { + editor.dom.$(toLi).empty(); + mergeLiElements(editor.dom, fromLi, toLi); + editor.selection.setCursorLocation(toLi); + }; + var mergeForward = function (editor, rng, fromLi, toLi) { + var dom = editor.dom; + if (dom.isEmpty(toLi)) { + mergeIntoEmptyLi(editor, fromLi, toLi); + } else { + var bookmark = createBookmark(rng); + mergeLiElements(dom, fromLi, toLi); + editor.selection.setRng(resolveBookmark(bookmark)); + } + }; + var mergeBackward = function (editor, rng, fromLi, toLi) { + var bookmark = createBookmark(rng); + mergeLiElements(editor.dom, fromLi, toLi); + var resolvedBookmark = resolveBookmark(bookmark); + editor.selection.setRng(resolvedBookmark); + }; + var backspaceDeleteFromListToListCaret = function (editor, isForward) { + var dom = editor.dom, selection = editor.selection; + var selectionStartElm = selection.getStart(); + var root = getClosestListRootElm(editor, selectionStartElm); + var li = dom.getParent(selection.getStart(), 'LI', root); + if (li) { + var ul = li.parentNode; + if (ul === editor.getBody() && isEmpty(dom, ul)) { + return true; + } + var rng_1 = normalizeRange(selection.getRng()); + var otherLi_1 = dom.getParent(findNextCaretContainer(editor, rng_1, isForward, root), 'LI', root); + if (otherLi_1 && otherLi_1 !== li) { + editor.undoManager.transact(function () { + if (isForward) { + mergeForward(editor, rng_1, otherLi_1, li); + } else { + if (isFirstChild(li)) { + outdentListSelection(editor); + } else { + mergeBackward(editor, rng_1, li, otherLi_1); + } + } + }); + return true; + } else if (!otherLi_1) { + if (!isForward && rng_1.startOffset === 0 && rng_1.endOffset === 0) { + editor.undoManager.transact(function () { + flattenListSelection(editor); + }); + return true; + } + } + } + return false; + }; + var removeBlock = function (dom, block, root) { + var parentBlock = dom.getParent(block.parentNode, dom.isBlock, root); + dom.remove(block); + if (parentBlock && dom.isEmpty(parentBlock)) { + dom.remove(parentBlock); + } + }; + var backspaceDeleteIntoListCaret = function (editor, isForward) { + var dom = editor.dom; + var selectionStartElm = editor.selection.getStart(); + var root = getClosestListRootElm(editor, selectionStartElm); + var block = dom.getParent(selectionStartElm, dom.isBlock, root); + if (block && dom.isEmpty(block)) { + var rng = normalizeRange(editor.selection.getRng()); + var otherLi_2 = dom.getParent(findNextCaretContainer(editor, rng, isForward, root), 'LI', root); + if (otherLi_2) { + editor.undoManager.transact(function () { + removeBlock(dom, block, root); + mergeWithAdjacentLists(dom, otherLi_2.parentNode); + editor.selection.select(otherLi_2, true); + editor.selection.collapse(isForward); + }); + return true; + } + } + return false; + }; + var backspaceDeleteCaret = function (editor, isForward) { + return backspaceDeleteFromListToListCaret(editor, isForward) || backspaceDeleteIntoListCaret(editor, isForward); + }; + var backspaceDeleteRange = function (editor) { + var selectionStartElm = editor.selection.getStart(); + var root = getClosestListRootElm(editor, selectionStartElm); + var startListParent = editor.dom.getParent(selectionStartElm, 'LI,DT,DD', root); + if (startListParent || getSelectedListItems(editor).length > 0) { + editor.undoManager.transact(function () { + editor.execCommand('Delete'); + normalizeLists(editor.dom, editor.getBody()); + }); + return true; + } + return false; + }; + var backspaceDelete = function (editor, isForward) { + return editor.selection.isCollapsed() ? backspaceDeleteCaret(editor, isForward) : backspaceDeleteRange(editor); + }; + var setup = function (editor) { + editor.on('keydown', function (e) { + if (e.keyCode === global$3.BACKSPACE) { + if (backspaceDelete(editor, false)) { + e.preventDefault(); + } + } else if (e.keyCode === global$3.DELETE) { + if (backspaceDelete(editor, true)) { + e.preventDefault(); + } + } + }); + }; + + var get$1 = function (editor) { + return { + backspaceDelete: function (isForward) { + backspaceDelete(editor, isForward); + } + }; + }; + + var open = function (editor) { + var dom = editor.dom; + var currentList = getParentList(editor); + if (!isOlNode(currentList)) { + return; + } + editor.windowManager.open({ + title: 'List Properties', + body: { + type: 'panel', + items: [{ + type: 'input', + name: 'start', + label: 'Start list at number', + inputMode: 'numeric' + }] + }, + initialData: { start: dom.getAttrib(currentList, 'start') || '1' }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + onSubmit: function (api) { + var data = api.getData(); + editor.undoManager.transact(function () { + dom.setAttrib(getParentList(editor), 'start', data.start === '1' ? '' : data.start); + }); + api.close(); + } + }); + }; + + var queryListCommandState = function (editor, listName) { + return function () { + var parentList = editor.dom.getParent(editor.selection.getStart(), 'UL,OL,DL'); + return parentList && parentList.nodeName === listName; + }; + }; + var register = function (editor) { + editor.on('BeforeExecCommand', function (e) { + var cmd = e.command.toLowerCase(); + if (cmd === 'indent') { + indentListSelection(editor); + } else if (cmd === 'outdent') { + outdentListSelection(editor); + } + }); + editor.addCommand('InsertUnorderedList', function (ui, detail) { + toggleList(editor, 'UL', detail); + }); + editor.addCommand('InsertOrderedList', function (ui, detail) { + toggleList(editor, 'OL', detail); + }); + editor.addCommand('InsertDefinitionList', function (ui, detail) { + toggleList(editor, 'DL', detail); + }); + editor.addCommand('RemoveList', function () { + flattenListSelection(editor); + }); + editor.addCommand('mceListProps', function () { + open(editor); + }); + editor.addQueryStateHandler('InsertUnorderedList', queryListCommandState(editor, 'UL')); + editor.addQueryStateHandler('InsertOrderedList', queryListCommandState(editor, 'OL')); + editor.addQueryStateHandler('InsertDefinitionList', queryListCommandState(editor, 'DL')); + }; + + var setupTabKey = function (editor) { + editor.on('keydown', function (e) { + if (e.keyCode !== global$3.TAB || global$3.metaKeyPressed(e)) { + return; + } + editor.undoManager.transact(function () { + if (e.shiftKey ? outdentListSelection(editor) : indentListSelection(editor)) { + e.preventDefault(); + } + }); + }); + }; + var setup$1 = function (editor) { + if (shouldIndentOnTab(editor)) { + setupTabKey(editor); + } + setup(editor); + }; + + var register$1 = function (editor) { + var exec = function (command) { + return function () { + return editor.execCommand(command); + }; + }; + if (!editor.hasPlugin('advlist')) { + editor.ui.registry.addToggleButton('numlist', { + icon: 'ordered-list', + active: false, + tooltip: 'Numbered list', + onAction: exec('InsertOrderedList'), + onSetup: function (api) { + return listState(editor, 'OL', api.setActive); + } + }); + editor.ui.registry.addToggleButton('bullist', { + icon: 'unordered-list', + active: false, + tooltip: 'Bullet list', + onAction: exec('InsertUnorderedList'), + onSetup: function (api) { + return listState(editor, 'UL', api.setActive); + } + }); + } + }; + + var register$2 = function (editor) { + var listProperties = { + text: 'List properties...', + icon: 'ordered-list', + onAction: function () { + return open(editor); + }, + onSetup: function (api) { + return listState(editor, 'OL', function (active) { + return api.setDisabled(!active); + }); + } + }; + editor.ui.registry.addMenuItem('listprops', listProperties); + editor.ui.registry.addContextMenu('lists', { + update: function (node) { + var parentList = getParentList(editor, node); + return isOlNode(parentList) ? ['listprops'] : []; + } + }); + }; + + function Plugin () { + global.add('lists', function (editor) { + if (editor.hasPlugin('rtc', true) === false) { + setup$1(editor); + register(editor); + } + register$1(editor); + register$2(editor); + return get$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/lists/plugin.min.js b/src/assets/tinymce/plugins/lists/plugin.min.js new file mode 100644 index 00000000..a6a7b66b --- /dev/null +++ b/src/assets/tinymce/plugins/lists/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e,n,t,r,o,i,u,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),s=function(){},y=function(e){return function(){return e}},c=function(n){return function(e){return!n(e)}},f=y(!1),d=y(!0),l=function(){return m},m=(e=function(e){return e.isNone()},{fold:function(e,n){return e()},is:f,isSome:f,isNone:d,getOr:t=function(e){return e},getOrThunk:n=function(e){return e()},getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:y(null),getOrUndefined:y(undefined),or:t,orThunk:n,map:l,each:s,bind:l,exists:f,forall:d,filter:l,equals:e,equals_:e,toArray:function(){return[]},toString:y("none()")}),p=function(t){var e=y(t),n=function(){return o},r=function(e){return e(t)},o={fold:function(e,n){return n(t)},is:function(e){return t===e},isSome:d,isNone:f,getOr:e,getOrThunk:e,getOrDie:e,getOrNull:e,getOrUndefined:e,or:n,orThunk:n,map:function(e){return p(e(t))},each:function(e){e(t)},bind:r,exists:r,forall:r,filter:function(e){return e(t)?o:m},toArray:function(){return[t]},toString:function(){return"some("+t+")"},equals:function(e){return e.is(t)},equals_:function(e,n){return e.fold(f,function(e){return n(t,e)})}};return o},g={some:p,none:l,from:function(e){return null===e||e===undefined?m:p(e)}},v=function(r){return function(e){return t=typeof(n=e),(null===n?"null":"object"==t&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==t&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":t)===r;var n,t}},h=function(n){return function(e){return typeof e===n}},S=v("string"),b=v("array"),C=h("boolean"),O=h("function"),N=h("number"),L=Array.prototype.slice,T=Array.prototype.push,D=function(e,n){for(var t=e.length,r=new Array(t),o=0;o=e.childNodes.length?t.data.length:0}:t.previousSibling&&je(t.previousSibling)?{container:t.previousSibling,offset:t.previousSibling.data.length}:t.nextSibling&&je(t.nextSibling)?{container:t.nextSibling,offset:0}:{container:e,offset:n}},un=function(e){var n=e.cloneRange(),t=on(e.startContainer,e.startOffset);n.setStart(t.container,t.offset);var r=on(e.endContainer,e.endOffset);return n.setEnd(r.container,r.offset),n},an=tinymce.util.Tools.resolve("tinymce.dom.DomQuery"),sn=function(e,n){var t=n||e.selection.getStart(!0);return e.dom.getParent(t,"OL,UL,DL",dn(e,t))},cn=function(e){var n,t,r,o=sn(e),i=e.selection.getSelectedBlocks();return r=i,(t=o)&&1===r.length&&r[0]===t?(n=o,Fe.grep(n.querySelectorAll("ol,ul,dl"),function(e){return qe(e)})):Fe.grep(i,function(e){return qe(e)&&o!==e})},fn=function(e){var t,n,r,o=e.selection.getSelectedBlocks();return Fe.grep((t=e,n=o,r=Fe.map(n,function(e){var n=t.dom.getParent(e,"li,dd,dt",dn(t,e));return n||e}),an.unique(r)),function(e){return We(e)})},dn=function(e,n){var t=e.dom.getParents(n,"TD,TH");return 0e.length?On:Cn)(t,e,n)},[]),R(r).map(function(e){return e.list}).toArray()},In=function(a,e,s){var n,t=En(e,(n=D(fn(a),le.fromDom),gn(E(n,c(Ln)),E(B(n),c(Ln)),function(e,n){return{start:e,end:n}})));k(t,function(e){var n,t;n=e.entries,t=s,k(w(n,Dn),function(e){return function(e,n){switch(e){case"Indent":n.depth++;break;case"Outdent":n.depth--;break;case"Flatten":n.depth=0}n.dirty=!0}(t,e),0});var r,o,i,u=(r=a,o=e.entries,P(function(e,n){if(0===e.length)return[];for(var t=n(e[0]),r=[],o=[],i=0,u=e.length;i 1) { + return protocolMatches[1] === 'www.' ? 'https://' : protocolMatches[1]; + } else { + return 'https://'; + } + }; + var getUrl = function (pattern, url) { + var protocol = getProtocol(url); + var match = pattern.regex.exec(url); + var newUrl = protocol + pattern.url; + var _loop_1 = function (i) { + newUrl = newUrl.replace('$' + i, function () { + return match[i] ? match[i] : ''; + }); + }; + for (var i = 0; i < match.length; i++) { + _loop_1(i); + } + return newUrl.replace(/\?$/, ''); + }; + var matchPattern = function (url) { + var patterns = urlPatterns.filter(function (pattern) { + return pattern.regex.test(url); + }); + if (patterns.length > 0) { + return global$1.extend({}, patterns[0], { url: getUrl(patterns[0], url) }); + } else { + return null; + } + }; + + var getIframeHtml = function (data) { + var allowFullscreen = data.allowFullscreen ? ' allowFullscreen="1"' : ''; + return ''; + }; + var getFlashHtml = function (data) { + var html = ''; + if (data.poster) { + html += ''; + } + html += ''; + return html; + }; + var getAudioHtml = function (data, audioTemplateCallback) { + if (audioTemplateCallback) { + return audioTemplateCallback(data); + } else { + return ''; + } + }; + var getVideoHtml = function (data, videoTemplateCallback) { + if (videoTemplateCallback) { + return videoTemplateCallback(data); + } else { + return ''; + } + }; + var getScriptHtml = function (data) { + return ''; + }; + var dataToHtml = function (editor, dataIn) { + var data = global$1.extend({}, dataIn); + if (!data.source) { + global$1.extend(data, htmlToData(getScripts(editor), data.embed)); + if (!data.source) { + return ''; + } + } + if (!data.altsource) { + data.altsource = ''; + } + if (!data.poster) { + data.poster = ''; + } + data.source = editor.convertURL(data.source, 'source'); + data.altsource = editor.convertURL(data.altsource, 'source'); + data.sourcemime = guess(data.source); + data.altsourcemime = guess(data.altsource); + data.poster = editor.convertURL(data.poster, 'poster'); + var pattern = matchPattern(data.source); + if (pattern) { + data.source = pattern.url; + data.type = pattern.type; + data.allowFullscreen = pattern.allowFullscreen; + data.width = data.width || String(pattern.w); + data.height = data.height || String(pattern.h); + } + if (data.embed) { + return updateHtml(data.embed, data, true); + } else { + var videoScript = getVideoScriptMatch(getScripts(editor), data.source); + if (videoScript) { + data.type = 'script'; + data.width = String(videoScript.width); + data.height = String(videoScript.height); + } + var audioTemplateCallback = getAudioTemplateCallback(editor); + var videoTemplateCallback = getVideoTemplateCallback(editor); + data.width = data.width || '300'; + data.height = data.height || '150'; + global$1.each(data, function (value, key) { + data[key] = editor.dom.encode('' + value); + }); + if (data.type === 'iframe') { + return getIframeHtml(data); + } else if (data.sourcemime === 'application/x-shockwave-flash') { + return getFlashHtml(data); + } else if (data.sourcemime.indexOf('audio') !== -1) { + return getAudioHtml(data, audioTemplateCallback); + } else if (data.type === 'script') { + return getScriptHtml(data); + } else { + return getVideoHtml(data, videoTemplateCallback); + } + } + }; + + var global$6 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var cache = {}; + var embedPromise = function (data, dataToHtml, handler) { + return new global$6(function (res, rej) { + var wrappedResolve = function (response) { + if (response.html) { + cache[data.source] = response; + } + return res({ + url: data.source, + html: response.html ? response.html : dataToHtml(data) + }); + }; + if (cache[data.source]) { + wrappedResolve(cache[data.source]); + } else { + handler({ url: data.source }, wrappedResolve, rej); + } + }); + }; + var defaultPromise = function (data, dataToHtml) { + return new global$6(function (res) { + res({ + html: dataToHtml(data), + url: data.source + }); + }); + }; + var loadedData = function (editor) { + return function (data) { + return dataToHtml(editor, data); + }; + }; + var getEmbedHtml = function (editor, data) { + var embedHandler = getUrlResolver(editor); + return embedHandler ? embedPromise(data, loadedData(editor), embedHandler) : defaultPromise(data, loadedData(editor)); + }; + var isCached = function (url) { + return cache.hasOwnProperty(url); + }; + + var extractMeta = function (sourceInput, data) { + return get(data, sourceInput).bind(function (mainData) { + return get(mainData, 'meta'); + }); + }; + var getValue = function (data, metaData, sourceInput) { + return function (prop) { + var _a; + var getFromData = function () { + return get(data, prop); + }; + var getFromMetaData = function () { + return get(metaData, prop); + }; + var getNonEmptyValue = function (c) { + return get(c, 'value').bind(function (v) { + return v.length > 0 ? Optional.some(v) : Optional.none(); + }); + }; + var getFromValueFirst = function () { + return getFromData().bind(function (child) { + return isObject(child) ? getNonEmptyValue(child).orThunk(getFromMetaData) : getFromMetaData().orThunk(function () { + return Optional.from(child); + }); + }); + }; + var getFromMetaFirst = function () { + return getFromMetaData().orThunk(function () { + return getFromData().bind(function (child) { + return isObject(child) ? getNonEmptyValue(child) : Optional.from(child); + }); + }); + }; + return _a = {}, _a[prop] = (prop === sourceInput ? getFromValueFirst() : getFromMetaFirst()).getOr(''), _a; + }; + }; + var getDimensions = function (data, metaData) { + var dimensions = {}; + get(data, 'dimensions').each(function (dims) { + each([ + 'width', + 'height' + ], function (prop) { + get(metaData, prop).orThunk(function () { + return get(dims, prop); + }).each(function (value) { + return dimensions[prop] = value; + }); + }); + }); + return dimensions; + }; + var unwrap = function (data, sourceInput) { + var metaData = sourceInput ? extractMeta(sourceInput, data).getOr({}) : {}; + var get = getValue(data, metaData, sourceInput); + return __assign(__assign(__assign(__assign(__assign({}, get('source')), get('altsource')), get('poster')), get('embed')), getDimensions(data, metaData)); + }; + var wrap = function (data) { + var wrapped = __assign(__assign({}, data), { + source: { value: get(data, 'source').getOr('') }, + altsource: { value: get(data, 'altsource').getOr('') }, + poster: { value: get(data, 'poster').getOr('') } + }); + each([ + 'width', + 'height' + ], function (prop) { + get(data, prop).each(function (value) { + var dimensions = wrapped.dimensions || {}; + dimensions[prop] = value; + wrapped.dimensions = dimensions; + }); + }); + return wrapped; + }; + var handleError = function (editor) { + return function (error) { + var errorMessage = error && error.msg ? 'Media embed handler error: ' + error.msg : 'Media embed handler threw unknown error.'; + editor.notificationManager.open({ + type: 'error', + text: errorMessage + }); + }; + }; + var snippetToData = function (editor, embedSnippet) { + return htmlToData(getScripts(editor), embedSnippet); + }; + var isMediaElement = function (element) { + return element.getAttribute('data-mce-object') || element.getAttribute('data-ephox-embed-iri'); + }; + var getEditorData = function (editor) { + var element = editor.selection.getNode(); + var snippet = isMediaElement(element) ? editor.serializer.serialize(element, { selection: true }) : ''; + return __assign({ embed: snippet }, htmlToData(getScripts(editor), snippet)); + }; + var addEmbedHtml = function (api, editor) { + return function (response) { + if (isString(response.url) && response.url.trim().length > 0) { + var html = response.html; + var snippetData = snippetToData(editor, html); + var nuData = __assign(__assign({}, snippetData), { + source: response.url, + embed: html + }); + api.setData(wrap(nuData)); + } + }; + }; + var selectPlaceholder = function (editor, beforeObjects) { + var afterObjects = editor.dom.select('img[data-mce-object]'); + for (var i = 0; i < beforeObjects.length; i++) { + for (var y = afterObjects.length - 1; y >= 0; y--) { + if (beforeObjects[i] === afterObjects[y]) { + afterObjects.splice(y, 1); + } + } + } + editor.selection.select(afterObjects[0]); + }; + var handleInsert = function (editor, html) { + var beforeObjects = editor.dom.select('img[data-mce-object]'); + editor.insertContent(html); + selectPlaceholder(editor, beforeObjects); + editor.nodeChanged(); + }; + var submitForm = function (prevData, newData, editor) { + newData.embed = updateHtml(newData.embed, newData); + if (newData.embed && (prevData.source === newData.source || isCached(newData.source))) { + handleInsert(editor, newData.embed); + } else { + getEmbedHtml(editor, newData).then(function (response) { + handleInsert(editor, response.html); + }).catch(handleError(editor)); + } + }; + var showDialog = function (editor) { + var editorData = getEditorData(editor); + var currentData = Cell(editorData); + var initialData = wrap(editorData); + var handleSource = function (prevData, api) { + var serviceData = unwrap(api.getData(), 'source'); + if (prevData.source !== serviceData.source) { + addEmbedHtml(win, editor)({ + url: serviceData.source, + html: '' + }); + getEmbedHtml(editor, serviceData).then(addEmbedHtml(win, editor)).catch(handleError(editor)); + } + }; + var handleEmbed = function (api) { + var data = unwrap(api.getData()); + var dataFromEmbed = snippetToData(editor, data.embed); + api.setData(wrap(dataFromEmbed)); + }; + var handleUpdate = function (api, sourceInput) { + var data = unwrap(api.getData(), sourceInput); + var embed = dataToHtml(editor, data); + api.setData(wrap(__assign(__assign({}, data), { embed: embed }))); + }; + var mediaInput = [{ + name: 'source', + type: 'urlinput', + filetype: 'media', + label: 'Source' + }]; + var sizeInput = !hasDimensions(editor) ? [] : [{ + type: 'sizeinput', + name: 'dimensions', + label: 'Constrain proportions', + constrain: true + }]; + var generalTab = { + title: 'General', + name: 'general', + items: flatten([ + mediaInput, + sizeInput + ]) + }; + var embedTextarea = { + type: 'textarea', + name: 'embed', + label: 'Paste your embed code below:' + }; + var embedTab = { + title: 'Embed', + items: [embedTextarea] + }; + var advancedFormItems = []; + if (hasAltSource(editor)) { + advancedFormItems.push({ + name: 'altsource', + type: 'urlinput', + filetype: 'media', + label: 'Alternative source URL' + }); + } + if (hasPoster(editor)) { + advancedFormItems.push({ + name: 'poster', + type: 'urlinput', + filetype: 'image', + label: 'Media poster (Image URL)' + }); + } + var advancedTab = { + title: 'Advanced', + name: 'advanced', + items: advancedFormItems + }; + var tabs = [ + generalTab, + embedTab + ]; + if (advancedFormItems.length > 0) { + tabs.push(advancedTab); + } + var body = { + type: 'tabpanel', + tabs: tabs + }; + var win = editor.windowManager.open({ + title: 'Insert/Edit Media', + size: 'normal', + body: body, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + onSubmit: function (api) { + var serviceData = unwrap(api.getData()); + submitForm(currentData.get(), serviceData, editor); + api.close(); + }, + onChange: function (api, detail) { + switch (detail.name) { + case 'source': + handleSource(currentData.get(), api); + break; + case 'embed': + handleEmbed(api); + break; + case 'dimensions': + case 'altsource': + case 'poster': + handleUpdate(api, detail.name); + break; + } + currentData.set(unwrap(api.getData())); + }, + initialData: initialData + }); + }; + + var get$1 = function (editor) { + var showDialog$1 = function () { + showDialog(editor); + }; + return { showDialog: showDialog$1 }; + }; + + var register = function (editor) { + var showDialog$1 = function () { + showDialog(editor); + }; + editor.addCommand('mceMedia', showDialog$1); + }; + + var global$7 = tinymce.util.Tools.resolve('tinymce.html.Node'); + + var global$8 = tinymce.util.Tools.resolve('tinymce.Env'); + + var sanitize = function (editor, html) { + if (shouldFilterHtml(editor) === false) { + return html; + } + var writer = global$5(); + var blocked; + global$3({ + validate: false, + allow_conditional_comments: false, + comment: function (text) { + writer.comment(text); + }, + cdata: function (text) { + writer.cdata(text); + }, + text: function (text, raw) { + writer.text(text, raw); + }, + start: function (name, attrs, empty) { + blocked = true; + if (name === 'script' || name === 'noscript' || name === 'svg') { + return; + } + for (var i = attrs.length - 1; i >= 0; i--) { + var attrName = attrs[i].name; + if (attrName.indexOf('on') === 0) { + delete attrs.map[attrName]; + attrs.splice(i, 1); + } + if (attrName === 'style') { + attrs[i].value = editor.dom.serializeStyle(editor.dom.parseStyle(attrs[i].value), name); + } + } + writer.start(name, attrs, empty); + blocked = false; + }, + end: function (name) { + if (blocked) { + return; + } + writer.end(name); + } + }, global$4({})).parse(html); + return writer.getContent(); + }; + + var createPlaceholderNode = function (editor, node) { + var name = node.name; + var placeHolder = new global$7('img', 1); + placeHolder.shortEnded = true; + retainAttributesAndInnerHtml(editor, node, placeHolder); + placeHolder.attr({ + 'width': node.attr('width') || '300', + 'height': node.attr('height') || (name === 'audio' ? '30' : '150'), + 'style': node.attr('style'), + 'src': global$8.transparentSrc, + 'data-mce-object': name, + 'class': 'mce-object mce-object-' + name + }); + return placeHolder; + }; + var createPreviewIframeNode = function (editor, node) { + var name = node.name; + var previewWrapper = new global$7('span', 1); + previewWrapper.attr({ + 'contentEditable': 'false', + 'style': node.attr('style'), + 'data-mce-object': name, + 'class': 'mce-preview-object mce-object-' + name + }); + retainAttributesAndInnerHtml(editor, node, previewWrapper); + var previewNode = new global$7(name, 1); + previewNode.attr({ + src: node.attr('src'), + allowfullscreen: node.attr('allowfullscreen'), + style: node.attr('style'), + class: node.attr('class'), + width: node.attr('width'), + height: node.attr('height'), + frameborder: '0' + }); + var shimNode = new global$7('span', 1); + shimNode.attr('class', 'mce-shim'); + previewWrapper.append(previewNode); + previewWrapper.append(shimNode); + return previewWrapper; + }; + var retainAttributesAndInnerHtml = function (editor, sourceNode, targetNode) { + var attrName; + var attrValue; + var ai; + var attribs = sourceNode.attributes; + ai = attribs.length; + while (ai--) { + attrName = attribs[ai].name; + attrValue = attribs[ai].value; + if (attrName !== 'width' && attrName !== 'height' && attrName !== 'style') { + if (attrName === 'data' || attrName === 'src') { + attrValue = editor.convertURL(attrValue, attrName); + } + targetNode.attr('data-mce-p-' + attrName, attrValue); + } + } + var innerHtml = sourceNode.firstChild && sourceNode.firstChild.value; + if (innerHtml) { + targetNode.attr('data-mce-html', escape(sanitize(editor, innerHtml))); + targetNode.firstChild = null; + } + }; + var isPageEmbedWrapper = function (node) { + var nodeClass = node.attr('class'); + return nodeClass && /\btiny-pageembed\b/.test(nodeClass); + }; + var isWithinEmbedWrapper = function (node) { + while (node = node.parent) { + if (node.attr('data-ephox-embed-iri') || isPageEmbedWrapper(node)) { + return true; + } + } + return false; + }; + var placeHolderConverter = function (editor) { + return function (nodes) { + var i = nodes.length; + var node; + var videoScript; + while (i--) { + node = nodes[i]; + if (!node.parent) { + continue; + } + if (node.parent.attr('data-mce-object')) { + continue; + } + if (node.name === 'script') { + videoScript = getVideoScriptMatch(getScripts(editor), node.attr('src')); + if (!videoScript) { + continue; + } + } + if (videoScript) { + if (videoScript.width) { + node.attr('width', videoScript.width.toString()); + } + if (videoScript.height) { + node.attr('height', videoScript.height.toString()); + } + } + if (node.name === 'iframe' && hasLiveEmbeds(editor) && global$8.ceFalse) { + if (!isWithinEmbedWrapper(node)) { + node.replace(createPreviewIframeNode(editor, node)); + } + } else { + if (!isWithinEmbedWrapper(node)) { + node.replace(createPlaceholderNode(editor, node)); + } + } + } + }; + }; + + var setup = function (editor) { + editor.on('preInit', function () { + var specialElements = editor.schema.getSpecialElements(); + global$1.each('video audio iframe object'.split(' '), function (name) { + specialElements[name] = new RegExp(']*>', 'gi'); + }); + var boolAttrs = editor.schema.getBoolAttrs(); + global$1.each('webkitallowfullscreen mozallowfullscreen allowfullscreen'.split(' '), function (name) { + boolAttrs[name] = {}; + }); + editor.parser.addNodeFilter('iframe,video,audio,object,embed,script', placeHolderConverter(editor)); + editor.serializer.addAttributeFilter('data-mce-object', function (nodes, name) { + var i = nodes.length; + var node; + var realElm; + var ai; + var attribs; + var innerHtml; + var innerNode; + var realElmName; + var className; + while (i--) { + node = nodes[i]; + if (!node.parent) { + continue; + } + realElmName = node.attr(name); + realElm = new global$7(realElmName, 1); + if (realElmName !== 'audio' && realElmName !== 'script') { + className = node.attr('class'); + if (className && className.indexOf('mce-preview-object') !== -1) { + realElm.attr({ + width: node.firstChild.attr('width'), + height: node.firstChild.attr('height') + }); + } else { + realElm.attr({ + width: node.attr('width'), + height: node.attr('height') + }); + } + } + realElm.attr({ style: node.attr('style') }); + attribs = node.attributes; + ai = attribs.length; + while (ai--) { + var attrName = attribs[ai].name; + if (attrName.indexOf('data-mce-p-') === 0) { + realElm.attr(attrName.substr(11), attribs[ai].value); + } + } + if (realElmName === 'script') { + realElm.attr('type', 'text/javascript'); + } + innerHtml = node.attr('data-mce-html'); + if (innerHtml) { + innerNode = new global$7('#text', 3); + innerNode.raw = true; + innerNode.value = sanitize(editor, unescape(innerHtml)); + realElm.append(innerNode); + } + node.replace(realElm); + } + }); + }); + editor.on('SetContent', function () { + editor.$('span.mce-preview-object').each(function (index, elm) { + var $elm = editor.$(elm); + if ($elm.find('span.mce-shim').length === 0) { + $elm.append(''); + } + }); + }); + }; + + var setup$1 = function (editor) { + editor.on('ResolveName', function (e) { + var name; + if (e.target.nodeType === 1 && (name = e.target.getAttribute('data-mce-object'))) { + e.name = name; + } + }); + }; + + var setup$2 = function (editor) { + editor.on('click keyup touchend', function () { + var selectedNode = editor.selection.getNode(); + if (selectedNode && editor.dom.hasClass(selectedNode, 'mce-preview-object')) { + if (editor.dom.getAttrib(selectedNode, 'data-mce-selected')) { + selectedNode.setAttribute('data-mce-selected', '2'); + } + } + }); + editor.on('ObjectSelected', function (e) { + var objectType = e.target.getAttribute('data-mce-object'); + if (objectType === 'audio' || objectType === 'script') { + e.preventDefault(); + } + }); + editor.on('ObjectResized', function (e) { + var target = e.target; + var html; + if (target.getAttribute('data-mce-object')) { + html = target.getAttribute('data-mce-html'); + if (html) { + html = unescape(html); + target.setAttribute('data-mce-html', escape(updateHtml(html, { + width: String(e.width), + height: String(e.height) + }))); + } + } + }); + }; + + var stateSelectorAdapter = function (editor, selector) { + return function (buttonApi) { + return editor.selection.selectorChangedWithUnbind(selector.join(','), buttonApi.setActive).unbind; + }; + }; + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('media', { + tooltip: 'Insert/edit media', + icon: 'embed', + onAction: function () { + editor.execCommand('mceMedia'); + }, + onSetup: stateSelectorAdapter(editor, [ + 'img[data-mce-object]', + 'span[data-mce-object]', + 'div[data-ephox-embed-iri]' + ]) + }); + editor.ui.registry.addMenuItem('media', { + icon: 'embed', + text: 'Media...', + onAction: function () { + editor.execCommand('mceMedia'); + } + }); + }; + + function Plugin () { + global.add('media', function (editor) { + register(editor); + register$1(editor); + setup$1(editor); + setup(editor); + setup$2(editor); + return get$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/media/plugin.min.js b/src/assets/tinymce/plugins/media/plugin.min.js new file mode 100644 index 00000000..a540a82b --- /dev/null +++ b/src/assets/tinymce/plugins/media/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e,t,r,n=tinymce.util.Tools.resolve("tinymce.PluginManager"),p=function(){return(p=Object.assign||function(e){for(var t,r=1,n=arguments.length;r"):"application/x-shockwave-flash"===n.sourcemime?(l='',s.poster&&(l+=''),l+=""):-1!==n.sourcemime.indexOf("audio")?(c=n,(u=h)?u(c):'"):"script"===n.type?' '; + var directionality = editor.getBody().dir; + var dirAttr = directionality ? ' dir="' + encode(directionality) + '"' : ''; + var previewHtml = '' + '' + '' + headHtml + '' + '' + editor.getContent() + preventClicksOnLinksScript + '' + ''; + return previewHtml; + }; + + var open = function (editor) { + var content = getPreviewHtml(editor); + var dataApi = editor.windowManager.open({ + title: 'Preview', + size: 'large', + body: { + type: 'panel', + items: [{ + name: 'preview', + type: 'iframe', + sandboxed: true + }] + }, + buttons: [{ + type: 'cancel', + name: 'close', + text: 'Close', + primary: true + }], + initialData: { preview: content } + }); + dataApi.focus('close'); + }; + + var register = function (editor) { + editor.addCommand('mcePreview', function () { + open(editor); + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('preview', { + icon: 'preview', + tooltip: 'Preview', + onAction: function () { + return editor.execCommand('mcePreview'); + } + }); + editor.ui.registry.addMenuItem('preview', { + icon: 'preview', + text: 'Preview', + onAction: function () { + return editor.execCommand('mcePreview'); + } + }); + }; + + function Plugin () { + global.add('preview', function (editor) { + register(editor); + register$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/preview/plugin.min.js b/src/assets/tinymce/plugins/preview/plugin.min.js new file mode 100644 index 00000000..861aacf5 --- /dev/null +++ b/src/assets/tinymce/plugins/preview/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),f=tinymce.util.Tools.resolve("tinymce.Env"),w=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=function(e){var t=function(t){var n="",i=t.dom.encode,e=t.getParam("content_style","","string");n+='',e&&(n+='");var o=t.getParam("content_css_cors",!1,"boolean")?' crossorigin="anonymous"':"";w.each(t.contentCSS,function(e){n+='"});var r,a,c,s,d,m,l,y=-1===(s=(r=t).getParam("body_id","tinymce","string")).indexOf("=")?s:(c=(a=r).getParam("body_id","","hash"))[a.id]||c,u=-1===(l=(d=t).getParam("body_class","","string")).indexOf("=")?l:(m=d).getParam("body_class","","hash")[m.id]||"",v=' '; + var directionality = editor.getBody().dir; + var dirAttr = directionality ? ' dir="' + encode(directionality) + '"' : ''; + html = '' + '' + '' + '' + contentCssEntries_1 + preventClicksOnLinksScript + '' + '' + html + '' + ''; + } + return replaceTemplateValues(html, getPreviewReplaceValues(editor)); + }; + var open = function (editor, templateList) { + var createTemplates = function () { + if (!templateList || templateList.length === 0) { + var message = editor.translate('No templates defined.'); + editor.notificationManager.open({ + text: message, + type: 'info' + }); + return Optional.none(); + } + return Optional.from(global$1.map(templateList, function (template, index) { + var isUrlTemplate = function (t) { + return t.url !== undefined; + }; + return { + selected: index === 0, + text: template.title, + value: { + url: isUrlTemplate(template) ? Optional.from(template.url) : Optional.none(), + content: !isUrlTemplate(template) ? Optional.from(template.content) : Optional.none(), + description: template.description + } + }; + })); + }; + var createSelectBoxItems = function (templates) { + return map(templates, function (t) { + return { + text: t.text, + value: t.text + }; + }); + }; + var findTemplate = function (templates, templateTitle) { + return find(templates, function (t) { + return t.text === templateTitle; + }); + }; + var loadFailedAlert = function (api) { + editor.windowManager.alert('Could not load the specified template.', function () { + return api.focus('template'); + }); + }; + var getTemplateContent = function (t) { + return new global$4(function (resolve, reject) { + t.value.url.fold(function () { + return resolve(t.value.content.getOr('')); + }, function (url) { + return global$2.send({ + url: url, + success: function (html) { + resolve(html); + }, + error: function (e) { + reject(e); + } + }); + }); + }); + }; + var onChange = function (templates, updateDialog) { + return function (api, change) { + if (change.name === 'template') { + var newTemplateTitle = api.getData().template; + findTemplate(templates, newTemplateTitle).each(function (t) { + api.block('Loading...'); + getTemplateContent(t).then(function (previewHtml) { + updateDialog(api, t, previewHtml); + }).catch(function () { + updateDialog(api, t, ''); + api.disable('save'); + loadFailedAlert(api); + }); + }); + } + }; + }; + var onSubmit = function (templates) { + return function (api) { + var data = api.getData(); + findTemplate(templates, data.template).each(function (t) { + getTemplateContent(t).then(function (previewHtml) { + insertTemplate(editor, false, previewHtml); + api.close(); + }).catch(function () { + api.disable('save'); + loadFailedAlert(api); + }); + }); + }; + }; + var openDialog = function (templates) { + var selectBoxItems = createSelectBoxItems(templates); + var buildDialogSpec = function (bodyItems, initialData) { + return { + title: 'Insert Template', + size: 'large', + body: { + type: 'panel', + items: bodyItems + }, + initialData: initialData, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + onSubmit: onSubmit(templates), + onChange: onChange(templates, updateDialog) + }; + }; + var updateDialog = function (dialogApi, template, previewHtml) { + var content = getPreviewContent(editor, previewHtml); + var bodyItems = [ + { + type: 'selectbox', + name: 'template', + label: 'Templates', + items: selectBoxItems + }, + { + type: 'htmlpanel', + html: '

    ' + htmlEscape(template.value.description) + '

    ' + }, + { + label: 'Preview', + type: 'iframe', + name: 'preview', + sandboxed: false + } + ]; + var initialData = { + template: template.text, + preview: content + }; + dialogApi.unblock(); + dialogApi.redial(buildDialogSpec(bodyItems, initialData)); + dialogApi.focus('template'); + }; + var dialogApi = editor.windowManager.open(buildDialogSpec([], { + template: '', + preview: '' + })); + dialogApi.block('Loading...'); + getTemplateContent(templates[0]).then(function (previewHtml) { + updateDialog(dialogApi, templates[0], previewHtml); + }).catch(function () { + updateDialog(dialogApi, templates[0], ''); + dialogApi.disable('save'); + loadFailedAlert(dialogApi); + }); + }; + var optTemplates = createTemplates(); + optTemplates.each(openDialog); + }; + + var showDialog = function (editor) { + return function (templates) { + open(editor, templates); + }; + }; + var register$1 = function (editor) { + editor.ui.registry.addButton('template', { + icon: 'template', + tooltip: 'Insert template', + onAction: createTemplateList(editor, showDialog(editor)) + }); + editor.ui.registry.addMenuItem('template', { + icon: 'template', + text: 'Insert template...', + onAction: createTemplateList(editor, showDialog(editor)) + }); + }; + + function Plugin () { + global.add('template', function (editor) { + register$1(editor); + register(editor); + setup(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/assets/tinymce/plugins/template/plugin.min.js b/src/assets/tinymce/plugins/template/plugin.min.js new file mode 100644 index 00000000..d6bda48b --- /dev/null +++ b/src/assets/tinymce/plugins/template/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.6.2 (2020-12-08) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),t=function(){},o=function(e){return function(){return e}};var n,r,a,c=o(!1),u=o(!0),_=tinymce.util.Tools.resolve("tinymce.util.Tools"),s=tinymce.util.Tools.resolve("tinymce.util.XHR"),i=function(e){return e.getParam("template_mdate_classes","mdate")},l=function(e){return e.getParam("template_replace_values")},f=function(e){return e.getParam("template_mdate_format",e.translate("%Y-%m-%d"))},m=function(e,t){if((e=""+e).length":">","&":"&","'":"'"},N=function(e){return e.replace(/["'<>&]/g,function(e){return(A(t=C,n=e)?O.from(t[n]):O.none()).getOr(e);var t,n})},I=function(M,t){var e=function(e){return function(e,t){for(var n=e.length,r=new Array(n),a=0;a")&&(o="",(c=r.getParam("content_style","","string"))&&(o+='"),u=r.getParam("content_css_cors",!1,"boolean")?' crossorigin="anonymous"':"",_.each(r.contentCSS,function(e){o+='"}),i=-1===(g=(p=r).getParam("body_class","","string")).indexOf("=")?g:(d=p).getParam("body_class","","hash")[d.id]||"",l=r.dom.encode,s=' + + diff --git a/src/style-icons-auto.ts b/src/style-icons-auto.ts index a88a9cdd..f5a95b10 100644 --- a/src/style-icons-auto.ts +++ b/src/style-icons-auto.ts @@ -53,7 +53,8 @@ import { UserOutline, WeiboCircleOutline, EyeInvisibleOutline, - MoreOutline + MoreOutline, + MenuOutline } from '@ant-design/icons-angular/icons'; export const ICONS_AUTO = [ @@ -106,5 +107,6 @@ export const ICONS_AUTO = [ UserOutline, WeiboCircleOutline, EyeInvisibleOutline, - MoreOutline + MoreOutline, + MenuOutline ]; From 76951f250ce36ae18c0251673a12575fe2f83afe Mon Sep 17 00:00:00 2001 From: Taric Xin Date: Mon, 6 Dec 2021 17:49:20 +0800 Subject: [PATCH 0029/1600] =?UTF-8?q?=E7=A5=A8=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../etc-invoiced-list.component.html | 27 ++- .../etc-invoiced-list.component.less | 13 ++ .../etc-invoiced-list.component.ts | 121 +++++++++- .../transaction-details.component.html | 16 ++ .../transaction-details.component.less | 0 .../transaction-details.component.ts | 84 +++++++ .../etc-invoiced-logs.component.html | 32 ++- .../etc-invoiced-logs.component.less | 34 +++ .../etc-invoiced-logs.component.ts | 169 +++++++++++++- .../etc-invoiced-requested.component.html | 53 ++++- .../etc-invoiced-requested.component.less | 34 +++ .../etc-invoiced-requested.component.ts | 207 +++++++++++++++- .../invoice-requested-detail.component.html | 63 +++++ .../invoice-requested-detail.component.less | 13 ++ .../invoice-requested-detail.component.ts | 101 ++++++++ .../invoice-requested.component.html | 58 ++++- .../invoice-requested.component.less | 34 +++ .../invoice-requested.component.ts | 220 +++++++++++++++++- .../invoiced-list-detail.component.html | 61 +++++ .../invoiced-list-detail.component.less | 24 ++ .../invoiced-list-detail.component.ts | 121 ++++++++++ .../invoiced-list.component.html | 73 +++++- .../invoiced-list.component.less | 30 +++ .../invoiced-list/invoiced-list.component.ts | 186 ++++++++++++++- .../ticket-management-routing.module.ts | 4 + .../ticket-management.module.ts | 9 +- .../logistics-time-line.component.html | 6 + .../logistics-time-line.component.less | 28 +++ .../logistics-time-line.component.ts | 15 ++ src/app/shared/shared-delon.module.ts | 3 +- src/app/shared/shared-zorro.module.ts | 20 +- src/app/shared/shared.module.ts | 9 +- src/environments/environment.service.ts | 2 +- 33 files changed, 1835 insertions(+), 35 deletions(-) create mode 100644 src/app/routes/ticket-management/components/etc-invoiced-list/transaction-details/transaction-details.component.html create mode 100644 src/app/routes/ticket-management/components/etc-invoiced-list/transaction-details/transaction-details.component.less create mode 100644 src/app/routes/ticket-management/components/etc-invoiced-list/transaction-details/transaction-details.component.ts create mode 100644 src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.html create mode 100644 src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.less create mode 100644 src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.ts create mode 100644 src/app/routes/ticket-management/components/invoiced-list/invoiced-list-detail/invoiced-list-detail.component.html create mode 100644 src/app/routes/ticket-management/components/invoiced-list/invoiced-list-detail/invoiced-list-detail.component.less create mode 100644 src/app/routes/ticket-management/components/invoiced-list/invoiced-list-detail/invoiced-list-detail.component.ts create mode 100644 src/app/shared/components/logistics-time-line/logistics-time-line.component.html create mode 100644 src/app/shared/components/logistics-time-line/logistics-time-line.component.less create mode 100644 src/app/shared/components/logistics-time-line/logistics-time-line.component.ts diff --git a/src/app/routes/ticket-management/components/etc-invoiced-list/etc-invoiced-list.component.html b/src/app/routes/ticket-management/components/etc-invoiced-list/etc-invoiced-list.component.html index 1577aa56..94082590 100644 --- a/src/app/routes/ticket-management/components/etc-invoiced-list/etc-invoiced-list.component.html +++ b/src/app/routes/ticket-management/components/etc-invoiced-list/etc-invoiced-list.component.html @@ -1 +1,26 @@ -

    etc-invoiced-list works!

    + + + + +
    +
    + +
    +
    + + + +
    +
    +
    + + + + + \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/etc-invoiced-list/etc-invoiced-list.component.less b/src/app/routes/ticket-management/components/etc-invoiced-list/etc-invoiced-list.component.less index e69de29b..a3fa49cc 100644 --- a/src/app/routes/ticket-management/components/etc-invoiced-list/etc-invoiced-list.component.less +++ b/src/app/routes/ticket-management/components/etc-invoiced-list/etc-invoiced-list.component.less @@ -0,0 +1,13 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 16px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/etc-invoiced-list/etc-invoiced-list.component.ts b/src/app/routes/ticket-management/components/etc-invoiced-list/etc-invoiced-list.component.ts index bdf34a94..d7ce70e9 100644 --- a/src/app/routes/ticket-management/components/etc-invoiced-list/etc-invoiced-list.component.ts +++ b/src/app/routes/ticket-management/components/etc-invoiced-list/etc-invoiced-list.component.ts @@ -1,4 +1,10 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../services/system.service'; +import { TransactionDetailsComponent } from './transaction-details/transaction-details.component'; @Component({ selector: 'app-etc-invoiced-list', @@ -6,10 +12,119 @@ import { Component, OnInit } from '@angular/core'; styleUrls: ['./etc-invoiced-list.component.less'] }) export class ETCInvoicedListComponent implements OnInit { + url = `/rule?_allow_anonymous=true`; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = [ + { title: '运单号', index: 'no' }, + { title: '开票状态', index: 'callNo' }, + { title: '业务方', index: 'callNo' }, + { title: '业务方税号', index: 'callNo' }, + { title: '开票金额', index: 'callNo' }, + { title: '发票张数', index: 'callNo' }, + { title: '申请时间', index: 'updatedAt', type: 'date' }, + { + title: '操作', + buttons: [ + { + text: '交易明细', + click: item => this.showDetail(item) + } + ] + } + ]; + searchSchema: SFSchema = { + properties: { + orderSn: { + type: 'string', + title: '运单号', + ui: { + autocomplete: 'off' + } + }, + receiveName: { + type: 'string', + title: '开票状态', + enum: [ + { label: '全部', value: '' }, + { label: '待受理', value: '待受理' }, + { label: '待开票', value: '待开票' }, + { label: '开票中', value: '开票中' }, + { label: '已开票', value: '已开票' }, + { label: '已撤销', value: '已撤销' }, + { label: '已拒绝', value: '已拒绝' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName = i; + this.sf?.setValue('/receiveName', i); + } + }, + default: '' + }, + receiveName2: { + type: 'string', + title: '业务方', + enum: [ + { label: '全部', value: '' }, + { label: '待受理', value: '待受理' }, + { label: '待开票', value: '待开票' }, + { label: '开票中', value: '开票中' }, + { label: '已开票', value: '已开票' }, + { label: '已撤销', value: '已撤销' }, + { label: '已拒绝', value: '已拒绝' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName = i; + this.sf?.setValue('/receiveName', i); + } + }, + default: '' + } + } + }; - constructor() { } + reqParams = {}; - ngOnInit(): void { + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'filter': + this.st.load(); + break; + } } + showDetail(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '运单交易明细', + nzContent: TransactionDetailsComponent, + nzWidth: 800, + nzComponentParams: { data: [] }, + nzOnOk: com => { + console.log(com.selectedData); + }, + nzOkText: '导出' + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } } diff --git a/src/app/routes/ticket-management/components/etc-invoiced-list/transaction-details/transaction-details.component.html b/src/app/routes/ticket-management/components/etc-invoiced-list/transaction-details/transaction-details.component.html new file mode 100644 index 00000000..a0704a71 --- /dev/null +++ b/src/app/routes/ticket-management/components/etc-invoiced-list/transaction-details/transaction-details.component.html @@ -0,0 +1,16 @@ +
    +
    + +
    +
    + + +
    + + +
    \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/etc-invoiced-list/transaction-details/transaction-details.component.less b/src/app/routes/ticket-management/components/etc-invoiced-list/transaction-details/transaction-details.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/ticket-management/components/etc-invoiced-list/transaction-details/transaction-details.component.ts b/src/app/routes/ticket-management/components/etc-invoiced-list/transaction-details/transaction-details.component.ts new file mode 100644 index 00000000..c7146f90 --- /dev/null +++ b/src/app/routes/ticket-management/components/etc-invoiced-list/transaction-details/transaction-details.component.ts @@ -0,0 +1,84 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../../services/system.service'; + +@Component({ + selector: 'app-transaction-details', + templateUrl: './transaction-details.component.html', + styleUrls: ['./transaction-details.component.less'] +}) +export class TransactionDetailsComponent implements OnInit { + data = []; + selectedData = []; + url = `/rule?_allow_anonymous=true`; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = [ + { title: '交易id', index: 'no' }, + { title: '交易流水号', index: 'callNo' }, + { title: '交易金额', index: 'callNo' }, + { title: '开票状态', index: 'callNo' }, + { title: '交易时间', index: 'updatedAt', type: 'date' } + ]; + searchSchema: SFSchema = { + properties: { + receiveName: { + type: 'string', + title: '开票状态', + enum: [ + { label: '全部', value: '' }, + { label: '待受理', value: '待受理' }, + { label: '待开票', value: '待开票' }, + { label: '开票中', value: '开票中' }, + { label: '已开票', value: '已开票' }, + { label: '已撤销', value: '已撤销' }, + { label: '已拒绝', value: '已拒绝' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName = i; + this.sf?.setValue('/receiveName', i); + } + }, + default: '' + }, + createTime: { + title: '交易时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema + } + } + }; + + reqParams = {}; + + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'filter': + this.st.load(); + break; + } + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } +} diff --git a/src/app/routes/ticket-management/components/etc-invoiced-logs/etc-invoiced-logs.component.html b/src/app/routes/ticket-management/components/etc-invoiced-logs/etc-invoiced-logs.component.html index 5792d49c..c2ed8caa 100644 --- a/src/app/routes/ticket-management/components/etc-invoiced-logs/etc-invoiced-logs.component.html +++ b/src/app/routes/ticket-management/components/etc-invoiced-logs/etc-invoiced-logs.component.html @@ -1 +1,31 @@ -

    etc-invoiced-logs works!

    + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/etc-invoiced-logs/etc-invoiced-logs.component.less b/src/app/routes/ticket-management/components/etc-invoiced-logs/etc-invoiced-logs.component.less index e69de29b..3579aa56 100644 --- a/src/app/routes/ticket-management/components/etc-invoiced-logs/etc-invoiced-logs.component.less +++ b/src/app/routes/ticket-management/components/etc-invoiced-logs/etc-invoiced-logs.component.less @@ -0,0 +1,34 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 0; + } + } + + nz-range-picker { + width: 100%; + } + + .ant-tabs-tab-btn { + padding-left : 16px; + padding-right: 16px; + } +} + +.expend-options { + margin-top: 0px; +} + + +@media (min-width: 1200px) { + .expend-options { + margin-top: -40px; + } + +} \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/etc-invoiced-logs/etc-invoiced-logs.component.ts b/src/app/routes/ticket-management/components/etc-invoiced-logs/etc-invoiced-logs.component.ts index 9164381f..003971f1 100644 --- a/src/app/routes/ticket-management/components/etc-invoiced-logs/etc-invoiced-logs.component.ts +++ b/src/app/routes/ticket-management/components/etc-invoiced-logs/etc-invoiced-logs.component.ts @@ -1,4 +1,9 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../services/system.service'; @Component({ selector: 'app-etc-invoiced-logs', @@ -6,10 +11,168 @@ import { Component, OnInit } from '@angular/core'; styleUrls: ['./etc-invoiced-logs.component.less'] }) export class ETCInvoicedLogsComponent implements OnInit { + url = `/rule?_allow_anonymous=true`; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = [ + { title: '发票号码', index: 'no' }, + { title: '发票代码', index: 'callNo' }, + { title: '运单号', index: 'callNo' }, + { title: '车牌号', index: 'callNo' }, + { title: '入站口', index: 'callNo' }, + { title: '出站口', index: 'callNo' }, + { title: '里程(km)', index: 'callNo' }, + { title: '交易id', index: 'callNo' }, + { title: '交易金额(元)', index: 'callNo' }, + { title: '发票金额(元)', index: 'callNo' }, + { title: '税率', index: 'callNo' }, + { title: '税额(元)', index: 'callNo' }, + { title: '价税合计(元)', index: 'callNo' }, + { title: '交易时间', index: 'updatedAt', type: 'date' }, + { title: '开票日期', index: 'updatedAt', type: 'date' }, + { title: '购买方', index: 'callNo' }, + { title: '购方税号', index: 'callNo' }, + { title: '销售方', index: 'callNo' }, + { title: '销方税号', index: 'callNo' } + ]; + searchSchema: SFSchema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + orderSn: { + type: 'string', + title: '发票号码', + ui: { + placeholder: '请输入', + autocomplete: 'off' + } + }, + orderSn1: { + type: 'string', + title: '运单号', + ui: { + placeholder: '请输入', + autocomplete: 'off' + } + }, + orderSn2: { + type: 'string', + title: '车牌号', + ui: { + placeholder: '请输入', + autocomplete: 'off' + } + }, + createTime: { + title: '交易时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + createTime2: { + title: '开票日期', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + receiveName: { + type: 'string', + title: '购买方', + enum: [ + { label: '全部', value: '全部' }, + { label: '企业认证审核', value: '企业认证审核' }, + { label: '企业管理员审核', value: '企业管理员审核' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName = i; + this.sf?.setValue('/receiveName', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + } + }, + receiveName2: { + type: 'string', + title: '销售方', + enum: [ + { label: '全部', value: '全部' }, + { label: '企业认证审核', value: '企业认证审核' }, + { label: '企业管理员审核', value: '企业管理员审核' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName2 = i; + this.sf?.setValue('/receiveName2', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; - constructor() { } + reqParams = {}; - ngOnInit(): void { + _$expand = false; + + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'filter': + this.st.load(); + break; + } } + approval(): void {} + + add(): void {} + + routeTo(item: any) { + this.router.navigate(['/ticket/invoice-requested-detail/1']); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } } diff --git a/src/app/routes/ticket-management/components/etc-invoiced-requested/etc-invoiced-requested.component.html b/src/app/routes/ticket-management/components/etc-invoiced-requested/etc-invoiced-requested.component.html index fc8980c0..4bb31236 100644 --- a/src/app/routes/ticket-management/components/etc-invoiced-requested/etc-invoiced-requested.component.html +++ b/src/app/routes/ticket-management/components/etc-invoiced-requested/etc-invoiced-requested.component.html @@ -1 +1,52 @@ -

    etc-invoiced-requested works!

    + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + +
    + +
    + 已选择 + {{ selectedRows.length }} 条运单 + 清空 +
    +
    + + +
    + + +
    +
    + + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/etc-invoiced-requested/etc-invoiced-requested.component.less b/src/app/routes/ticket-management/components/etc-invoiced-requested/etc-invoiced-requested.component.less index e69de29b..3579aa56 100644 --- a/src/app/routes/ticket-management/components/etc-invoiced-requested/etc-invoiced-requested.component.less +++ b/src/app/routes/ticket-management/components/etc-invoiced-requested/etc-invoiced-requested.component.less @@ -0,0 +1,34 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 0; + } + } + + nz-range-picker { + width: 100%; + } + + .ant-tabs-tab-btn { + padding-left : 16px; + padding-right: 16px; + } +} + +.expend-options { + margin-top: 0px; +} + + +@media (min-width: 1200px) { + .expend-options { + margin-top: -40px; + } + +} \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/etc-invoiced-requested/etc-invoiced-requested.component.ts b/src/app/routes/ticket-management/components/etc-invoiced-requested/etc-invoiced-requested.component.ts index 4524863a..88e0da1d 100644 --- a/src/app/routes/ticket-management/components/etc-invoiced-requested/etc-invoiced-requested.component.ts +++ b/src/app/routes/ticket-management/components/etc-invoiced-requested/etc-invoiced-requested.component.ts @@ -1,4 +1,9 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../services/system.service'; @Component({ selector: 'app-etc-invoiced-requested', @@ -6,10 +11,206 @@ import { Component, OnInit } from '@angular/core'; styleUrls: ['./etc-invoiced-requested.component.less'] }) export class ETCInvoicedRequestedComponent implements OnInit { + url = `/rule?_allow_anonymous=true`; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('auditModal', { static: false }) + auditModal!: any; + columns: STColumn[] = [ + { title: '', index: 'key', type: 'checkbox' }, + { title: '运单号', index: 'no' }, + { title: '司机', index: 'callNo' }, + { title: '装货地', index: 'callNo' }, + { title: '卸货地', index: 'callNo' }, + { title: '托运人', index: 'callNo' }, + { title: '无车承运人', index: 'callNo' }, + { title: '派车时间', index: 'updatedAt', type: 'date' }, + { title: '提货时间', index: 'updatedAt', type: 'date' }, + { title: '卸货时间', index: 'updatedAt', type: 'date' }, + { title: '签收时间', index: 'updatedAt', type: 'date' }, + ]; + searchSchema: SFSchema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + orderSn: { + type: 'string', + title: '运单号', + ui: { + autocomplete: 'off', + placeholder: '请输入' + } + }, + orderSn1: { + type: 'string', + title: '司机', + ui: { + autocomplete: 'off', + placeholder: '姓名/手机' + } + }, + orderSn2: { + type: 'string', + title: '车牌号', + ui: { + autocomplete: 'off', + placeholder: '请输入' + } + }, + orderS3: { + type: 'string', + title: '卸货地', + ui: { + autocomplete: 'off', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + orderSn4: { + type: 'string', + title: '装货地', + ui: { + autocomplete: 'off', + placeholder: '请选择', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + orderSn5: { + type: 'string', + title: '托运人', + enum: [ + { label: '全部', value: '全部' }, + { label: '企业认证审核', value: '企业认证审核' }, + { label: '企业管理员审核', value: '企业管理员审核' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName = i; + this.sf?.setValue('/receiveName', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + } + }, + receiveName: { + type: 'string', + title: '无车承运人', + enum: [ + { label: '全部', value: '全部' }, + { label: '企业认证审核', value: '企业认证审核' }, + { label: '企业管理员审核', value: '企业管理员审核' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName = i; + this.sf?.setValue('/receiveName', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; - constructor() { } + reqParams = {}; - ngOnInit(): void { + _$expand = false; + + selectedRows: any[] = []; + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st.load(); + break; + } } + approval(): void {} + + add(): void {} + + routeTo(item: any) { + this.router.navigate(['/ticket/invoice-requested-detail/1']); + } + + auditAction(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '审核', + nzContent: this.auditModal, + nzFooter: [ + { + label: '拒绝', + type: 'default', + onClick: () => { + modal.destroy(); + } + }, + { + label: '通过', + type: 'primary', + onClick: () => { + modal.destroy(); + } + } + ] + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + + showReason(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '查看原因', + nzContent: '运单数据异常,暂时无法开票,请联系客服400-xxxx-xxxx', + nzFooter: [ + { + label: '关闭', + type: 'primary', + onClick: () => { + modal.destroy(); + } + } + ] + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } } diff --git a/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.html b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.html new file mode 100644 index 00000000..b146f52e --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.html @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + +
    +
    +
    + + +
    + + +
    + 已选择 + {{ selectedRows.length }} 条数据   开票金额总计 {{ + totalCallNo }} + 清空 +
    +
    + + +
    \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.less b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.less new file mode 100644 index 00000000..a3fa49cc --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.less @@ -0,0 +1,13 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 16px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.ts b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.ts new file mode 100644 index 00000000..b04d7e0c --- /dev/null +++ b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.ts @@ -0,0 +1,101 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../../services/system.service'; + +@Component({ + selector: 'app-invoice-requested-detail', + templateUrl: './invoice-requested-detail.component.html', + styleUrls: ['./invoice-requested-detail.component.less'] +}) +export class InvoiceRequestedDetailComponent implements OnInit { + url = `/rule?_allow_anonymous=true`; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = [ + { title: '', index: 'key', type: 'checkbox' }, + { title: '运单号', index: 'no' }, + { title: '开票状态', index: 'callNo' }, + { title: '开票金额', index: 'callNo' }, + { title: '总费用', index: 'callNo' }, + { title: '基础运费', index: 'callNo' }, + { title: '附加费', index: 'callNo' }, + { title: '发票号码', index: 'callNo' }, + { title: '开票日期', index: 'updatedAt', type: 'date' } + ]; + searchSchema: SFSchema = { + properties: { + orderSn: { + type: 'string', + title: '运单号', + ui: { + autocomplete: 'off' + } + }, + receiveName: { + type: 'string', + title: '开票状态', + enum: [ + { label: '全部', value: '' }, + { label: '待受理', value: '待受理' }, + { label: '待开票', value: '待开票' }, + { label: '开票中', value: '开票中' }, + { label: '已开票', value: '已开票' }, + { label: '已撤销', value: '已撤销' }, + { label: '已拒绝', value: '已拒绝' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName = i; + this.sf?.setValue('/receiveName', i); + } + }, + default: '' + }, + orderSn2: { + type: 'string', + title: '发票号码', + ui: { + autocomplete: 'off' + } + } + } + }; + + reqParams = {}; + + selectedRows: any[] = []; + totalCallNo = 0; + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + this.totalCallNo = this.selectedRows.reduce((total, cv) => total + cv.callNo, 0); + break; + case 'filter': + this.st.load(); + break; + } + } + + goBack() { + history.go(-1); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } +} diff --git a/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.html b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.html index 3a6aad34..249c1c37 100644 --- a/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.html +++ b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.html @@ -1 +1,57 @@ -

    invoice-requested works!

    + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + + + + +
    + +
    + 已选择 + {{ selectedRows.length }} 条数据   开票金额总计 {{ + totalCallNo }} + 清空 +
    +
    + + +
    + + +
    +
    + + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.less b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.less index e69de29b..3579aa56 100644 --- a/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.less +++ b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.less @@ -0,0 +1,34 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 0; + } + } + + nz-range-picker { + width: 100%; + } + + .ant-tabs-tab-btn { + padding-left : 16px; + padding-right: 16px; + } +} + +.expend-options { + margin-top: 0px; +} + + +@media (min-width: 1200px) { + .expend-options { + margin-top: -40px; + } + +} \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.ts b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.ts index 6a46f111..10d36072 100644 --- a/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.ts +++ b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested.component.ts @@ -1,4 +1,10 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema, SFUISchema } from '@delon/form'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../services/system.service'; @Component({ selector: 'app-invoice-requested', @@ -6,10 +12,218 @@ import { Component, OnInit } from '@angular/core'; styleUrls: ['./invoice-requested.component.less'] }) export class InvoiceRequestedComponent implements OnInit { + url = `/rule?_allow_anonymous=true`; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('auditModal', { static: false }) + auditModal!: any; + columns: STColumn[] = [ + { title: '', index: 'key', type: 'checkbox' }, + { title: '申请编号', index: 'no' }, + { title: '申请时间', index: 'updatedAt', type: 'date' }, + { title: '处理进度', index: 'callNo' }, + { title: '托运人', index: 'callNo' }, + { title: '开票方', index: 'callNo' }, + { title: '运单数', index: 'callNo' }, + { title: '开票金额', index: 'callNo' }, + { title: '发票张数', index: 'callNo' }, + { title: '收件人', index: 'callNo' }, + { title: '联系电话', index: 'callNo' }, + { title: '收件地址', index: 'callNo' }, + { title: '备注', index: 'callNo' }, + { + title: '操作', + buttons: [ + { + text: '审核', + click: item => this.auditAction(item) + }, + { + text: '去开票', + click: item => this.routeTo(item) + }, + { + text: '查看原因', + click: item => this.showReason(item) + }, + { + text: '订单明细', + click: item => this.routeTo(item) + } + ] + } + ]; + searchSchema: SFSchema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + orderSn: { + type: 'string', + title: '申请编号', + ui: { + autocomplete: 'off' + } + }, + createTime: { + title: '申请时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema + }, + receiveName: { + type: 'string', + title: '处理进度', + enum: [ + { label: '全部', value: '全部' }, + { label: '企业认证审核', value: '企业认证审核' }, + { label: '企业管理员审核', value: '企业管理员审核' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName = i; + this.sf?.setValue('/receiveName', i); + } + } + }, + receiveName2: { + type: 'string', + title: '托运人', + enum: [ + { label: '全部', value: '全部' }, + { label: '企业认证审核', value: '企业认证审核' }, + { label: '企业管理员审核', value: '企业管理员审核' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName2 = i; + this.sf?.setValue('/receiveName2', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + } + }, + receiveName3: { + type: 'string', + title: '开票方', + enum: [ + { label: '全部', value: '全部' }, + { label: '企业认证审核', value: '企业认证审核' }, + { label: '企业管理员审核', value: '企业管理员审核' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName3 = i; + this.sf?.setValue('/receiveName3', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; - constructor() { } + reqParams = {}; - ngOnInit(): void { + _$expand = false; + + selectedRows: any[] = []; + totalCallNo = 0; + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + this.totalCallNo = this.selectedRows.reduce((total, cv) => total + cv.callNo, 0); + break; + case 'filter': + this.st.load(); + break; + } } + approval(): void {} + + add(): void {} + + routeTo(item: any) { + this.router.navigate(['/ticket/invoice-requested-detail/1']); + } + + auditAction(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '审核', + nzContent: this.auditModal, + nzFooter: [ + { + label: '拒绝', + type: 'default', + onClick: () => { + modal.destroy(); + } + }, + { + label: '通过', + type: 'primary', + onClick: () => { + modal.destroy(); + } + } + ] + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + + showReason(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '查看原因', + nzContent: '运单数据异常,暂时无法开票,请联系客服400-xxxx-xxxx', + nzFooter: [ + { + label: '关闭', + type: 'primary', + onClick: () => { + modal.destroy(); + } + } + ] + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } } diff --git a/src/app/routes/ticket-management/components/invoiced-list/invoiced-list-detail/invoiced-list-detail.component.html b/src/app/routes/ticket-management/components/invoiced-list/invoiced-list-detail/invoiced-list-detail.component.html new file mode 100644 index 00000000..4e30f271 --- /dev/null +++ b/src/app/routes/ticket-management/components/invoiced-list/invoiced-list-detail/invoiced-list-detail.component.html @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoiced-list/invoiced-list-detail/invoiced-list-detail.component.less b/src/app/routes/ticket-management/components/invoiced-list/invoiced-list-detail/invoiced-list-detail.component.less new file mode 100644 index 00000000..6dee2fec --- /dev/null +++ b/src/app/routes/ticket-management/components/invoiced-list/invoiced-list-detail/invoiced-list-detail.component.less @@ -0,0 +1,24 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 16px; + } + } +} + +.expend-options { + margin-top: 0px; +} + +@media (min-width: 990px) { + .expend-options { + margin-top: -40px; + } + +} \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoiced-list/invoiced-list-detail/invoiced-list-detail.component.ts b/src/app/routes/ticket-management/components/invoiced-list/invoiced-list-detail/invoiced-list-detail.component.ts new file mode 100644 index 00000000..26596abd --- /dev/null +++ b/src/app/routes/ticket-management/components/invoiced-list/invoiced-list-detail/invoiced-list-detail.component.ts @@ -0,0 +1,121 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../../services/system.service'; + +@Component({ + selector: 'app-invoiced-list-detail', + templateUrl: './invoiced-list-detail.component.html', + styleUrls: ['./invoiced-list-detail.component.less'] +}) +export class InvoicedListDetailComponent implements OnInit { + url = `/rule?_allow_anonymous=true`; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = [ + { title: '订单号', index: 'no' }, + { title: '外部订单号', index: 'callNo' }, + { title: '装货地', index: 'callNo' }, + { title: '卸货地', index: 'callNo' }, + { title: '货物名称', index: 'callNo' }, + { title: '重量/体积', index: 'callNo' }, + { title: '开票金额', index: 'callNo' }, + { title: '总费用', index: 'callNo' }, + { title: '基础运费', index: 'callNo' }, + { title: '附加费', index: 'callNo' }, + ]; + searchSchema: SFSchema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + orderSn: { + type: 'string', + title: '订单号', + ui: { + autocomplete: 'off' + } + }, + orderSn2: { + type: 'string', + title: '外部订单号', + ui: { + autocomplete: 'off' + } + }, + orderSn3: { + type: 'string', + title: '发票号码', + ui: { + autocomplete: 'off' + } + }, + receiveName: { + type: 'string', + title: '开票状态', + enum: [ + { label: '全部', value: '' }, + { label: '待受理', value: '待受理' }, + { label: '待开票', value: '待开票' }, + { label: '开票中', value: '开票中' }, + { label: '已开票', value: '已开票' }, + { label: '已撤销', value: '已撤销' }, + { label: '已拒绝', value: '已拒绝' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName = i; + this.sf?.setValue('/receiveName', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + } + } + }; + + reqParams = {}; + _$expand = false; + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'filter': + this.st.load(); + break; + } + } + + goBack() { + history.go(-1); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } +} diff --git a/src/app/routes/ticket-management/components/invoiced-list/invoiced-list.component.html b/src/app/routes/ticket-management/components/invoiced-list/invoiced-list.component.html index fce28939..9e63c5e5 100644 --- a/src/app/routes/ticket-management/components/invoiced-list/invoiced-list.component.html +++ b/src/app/routes/ticket-management/components/invoiced-list/invoiced-list.component.html @@ -1 +1,72 @@ -

    invoiced-list works!

    + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + +
    + + +
    + 已选择 + {{ selectedRows.length }} 条数据   开票金额总计 {{ + totalCallNo }} + 清空 +
    +
    + + + + {{item.callNo}} + 查看物流 + + + +
    + + +
    +
    + + + + + + + + + +
    +
    +
    + + +

    + 顺丰快递:SF123456789 + 已签收 +

    + +
    \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoiced-list/invoiced-list.component.less b/src/app/routes/ticket-management/components/invoiced-list/invoiced-list.component.less index e69de29b..55b8191b 100644 --- a/src/app/routes/ticket-management/components/invoiced-list/invoiced-list.component.less +++ b/src/app/routes/ticket-management/components/invoiced-list/invoiced-list.component.less @@ -0,0 +1,30 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 16px; + } + } + + nz-range-picker { + width: 100%; + } + +} + +.expend-options { + margin-top: 0px; +} + + +@media (min-width: 1200px) { + .expend-options { + margin-top: -40px; + } + +} \ No newline at end of file diff --git a/src/app/routes/ticket-management/components/invoiced-list/invoiced-list.component.ts b/src/app/routes/ticket-management/components/invoiced-list/invoiced-list.component.ts index e9697bdd..cf16b366 100644 --- a/src/app/routes/ticket-management/components/invoiced-list/invoiced-list.component.ts +++ b/src/app/routes/ticket-management/components/invoiced-list/invoiced-list.component.ts @@ -1,4 +1,9 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from '../../services/system.service'; @Component({ selector: 'app-invoiced-list', @@ -6,10 +11,185 @@ import { Component, OnInit } from '@angular/core'; styleUrls: ['./invoiced-list.component.less'] }) export class InvoicedListComponent implements OnInit { + url = `/rule?_allow_anonymous=true`; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('logosticsModal', { static: false }) + logosticsModal!: any; + @ViewChild('logosticsLogsModal', { static: false }) + logosticsLogsModal!: any; + columns: STColumn[] = [ + { title: '', index: 'key', type: 'checkbox' }, + { title: '发票号码', index: 'no' }, + { title: '申请编号', index: 'callNo' }, + { title: '托运人', index: 'callNo' }, + { title: '无车承运人', index: 'callNo' }, + { title: '运单数', index: 'callNo' }, + { title: '开票金额', index: 'callNo' }, + { title: '税价合计', index: 'callNo' }, + { title: '开票日期', index: 'updatedAt', type: 'date' }, + { title: '快递信息', render: 'logostics' }, + { + title: '操作', + buttons: [ + { + text: '作废发票', + click: item => this.deletedInvoice(item) + }, + { + text: '预览发票', + click: item => this.routeTo(item) + }, + { + text: '填写物流', + click: item => this.editInvoice(item) + } + ] + } + ]; + searchSchema: SFSchema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + orderSn: { + type: 'string', + title: '发票号码', + ui: { + autocomplete: 'off' + } + }, + orderSn2: { + type: 'string', + title: '申请编号', + ui: { + autocomplete: 'off' + } + }, + createTime: { + title: '开票日期', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema + }, + receiveName: { + type: 'string', + title: '托运人', + enum: [{ label: '全部', value: '全部' }], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName = i; + this.sf?.setValue('/receiveName', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + } + }, + receiveName2: { + type: 'string', + title: '无车承运人', + enum: [{ label: '全部', value: '全部' }], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName2 = i; + this.sf?.setValue('/receiveName2', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; - constructor() { } + reqParams = {}; - ngOnInit(): void { + _$expand = false; + + selectedRows: any[] = []; + totalCallNo = 0; + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + this.totalCallNo = this.selectedRows.reduce((total, cv) => total + cv.callNo, 0); + break; + case 'filter': + this.st.load(); + break; + } } + approval(): void {} + + add(): void {} + + routeTo(item: any) { + this.router.navigate(['/ticket/invoice-list-detail/1']); + } + + delete(item: any) { + this.st.removeRow(item); + } + + editInvoice(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '填写物流/修改物流', + nzContent: this.logosticsModal, + nzOnOk: () => {} + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + + deletedInvoice(item: any) { + this.nzModalService.warning({ + nzTitle: '确定将所选发票作废?', + nzCancelText: '取消', + nzOnOk: () => {} + }); + } + + showlogosticsLogs(item: any) { + this.nzModalService.create({ + nzTitle: '查看物流', + nzWidth: 600, + nzContent: this.logosticsLogsModal, + nzFooter: [] + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } } diff --git a/src/app/routes/ticket-management/ticket-management-routing.module.ts b/src/app/routes/ticket-management/ticket-management-routing.module.ts index a1e0c8ac..470d70af 100644 --- a/src/app/routes/ticket-management/ticket-management-routing.module.ts +++ b/src/app/routes/ticket-management/ticket-management-routing.module.ts @@ -4,12 +4,16 @@ import { ETCBlacklistComponent } from './components/etc-blacklist/etc-blacklist. import { ETCInvoicedListComponent } from './components/etc-invoiced-list/etc-invoiced-list.component'; import { ETCInvoicedLogsComponent } from './components/etc-invoiced-logs/etc-invoiced-logs.component'; import { ETCInvoicedRequestedComponent } from './components/etc-invoiced-requested/etc-invoiced-requested.component'; +import { InvoiceRequestedDetailComponent } from './components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component'; import { InvoiceRequestedComponent } from './components/invoice-requested/invoice-requested.component'; +import { InvoicedListDetailComponent } from './components/invoiced-list/invoiced-list-detail/invoiced-list-detail.component'; import { InvoicedListComponent } from './components/invoiced-list/invoiced-list.component'; const routes: Routes = [ { path: 'invoice-requested', component: InvoiceRequestedComponent }, + { path: 'invoice-requested-detail/:id', component: InvoiceRequestedDetailComponent }, { path: 'invoice-list', component: InvoicedListComponent }, + { path: 'invoice-list-detail/:id', component: InvoicedListDetailComponent }, { path: 'etc-invoice-requested', component: ETCInvoicedRequestedComponent }, { path: 'etc-invoice-list', component: ETCInvoicedListComponent }, { path: 'etc-invoiced-logs', component: ETCInvoicedLogsComponent }, diff --git a/src/app/routes/ticket-management/ticket-management.module.ts b/src/app/routes/ticket-management/ticket-management.module.ts index 6960085d..fb64abba 100644 --- a/src/app/routes/ticket-management/ticket-management.module.ts +++ b/src/app/routes/ticket-management/ticket-management.module.ts @@ -8,6 +8,9 @@ import { ETCInvoicedLogsComponent } from './components/etc-invoiced-logs/etc-inv import { ETCBlacklistComponent } from './components/etc-blacklist/etc-blacklist.component'; import { InvoicedListComponent } from './components/invoiced-list/invoiced-list.component'; import { InvoiceRequestedComponent } from './components/invoice-requested/invoice-requested.component'; +import { InvoiceRequestedDetailComponent } from './components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component'; +import { InvoicedListDetailComponent } from './components/invoiced-list/invoiced-list-detail/invoiced-list-detail.component'; +import { TransactionDetailsComponent } from './components/etc-invoiced-list/transaction-details/transaction-details.component'; const COMPONENTS: any = [ ETCInvoicedListComponent, @@ -15,9 +18,11 @@ const COMPONENTS: any = [ ETCInvoicedLogsComponent, ETCBlacklistComponent, InvoiceRequestedComponent, - InvoicedListComponent + InvoicedListComponent, + InvoiceRequestedDetailComponent, + InvoicedListDetailComponent ]; -const NOTROUTECOMPONENTS: any = []; +const NOTROUTECOMPONENTS: any = [TransactionDetailsComponent]; @NgModule({ declarations: [...COMPONENTS, ...NOTROUTECOMPONENTS], imports: [CommonModule, TicketManagementRoutingModule, SharedModule] diff --git a/src/app/shared/components/logistics-time-line/logistics-time-line.component.html b/src/app/shared/components/logistics-time-line/logistics-time-line.component.html new file mode 100644 index 00000000..34f96ff9 --- /dev/null +++ b/src/app/shared/components/logistics-time-line/logistics-time-line.component.html @@ -0,0 +1,6 @@ + + 快件已签收 + 正在派送中,请您准备签收(派件人:吴彦祖,联系电话:13811223133) + 快件已到【深圳市龙岗区配送中心】扫描员是【张三】 + 【顺丰快递】的收件员已揽件 + \ No newline at end of file diff --git a/src/app/shared/components/logistics-time-line/logistics-time-line.component.less b/src/app/shared/components/logistics-time-line/logistics-time-line.component.less new file mode 100644 index 00000000..36f874bc --- /dev/null +++ b/src/app/shared/components/logistics-time-line/logistics-time-line.component.less @@ -0,0 +1,28 @@ +:host::ng-deep { + + .ant-timeline.ant-timeline-label .ant-timeline-item-label { + width: 140px; + text-align: left; + } + + .ant-timeline.ant-timeline-alternate .ant-timeline-item-tail, + .ant-timeline.ant-timeline-right .ant-timeline-item-tail, + .ant-timeline.ant-timeline-label .ant-timeline-item-tail, + .ant-timeline.ant-timeline-alternate .ant-timeline-item-head, + .ant-timeline.ant-timeline-right .ant-timeline-item-head, + .ant-timeline.ant-timeline-label .ant-timeline-item-head, + .ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom, + .ant-timeline.ant-timeline-right .ant-timeline-item-head-custom, + .ant-timeline.ant-timeline-label .ant-timeline-item-head-custom { + left: 145px; + } + + .ant-timeline.ant-timeline-alternate .ant-timeline-item-left .ant-timeline-item-content, + .ant-timeline.ant-timeline-right .ant-timeline-item-left .ant-timeline-item-content, + .ant-timeline.ant-timeline-label .ant-timeline-item-left .ant-timeline-item-content { + left : calc(50% - 135px); + width : calc(100% - 150px); + text-align: left; + } + +} \ No newline at end of file diff --git a/src/app/shared/components/logistics-time-line/logistics-time-line.component.ts b/src/app/shared/components/logistics-time-line/logistics-time-line.component.ts new file mode 100644 index 00000000..e57ad269 --- /dev/null +++ b/src/app/shared/components/logistics-time-line/logistics-time-line.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-logistics-time-line', + templateUrl: './logistics-time-line.component.html', + styleUrls: ['./logistics-time-line.component.less'] +}) +export class LogisticsTimeLineComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/src/app/shared/shared-delon.module.ts b/src/app/shared/shared-delon.module.ts index 097d78f6..f9ef368b 100644 --- a/src/app/shared/shared-delon.module.ts +++ b/src/app/shared/shared-delon.module.ts @@ -3,5 +3,6 @@ import { SEModule } from '@delon/abc/se'; import { STModule } from '@delon/abc/st'; import { SVModule } from '@delon/abc/sv'; import { DelonFormModule } from '@delon/form'; +import { QRModule } from '@delon/abc/qr'; -export const SHARED_DELON_MODULES = [PageHeaderModule, STModule, SVModule, SEModule,DelonFormModule ]; +export const SHARED_DELON_MODULES = [PageHeaderModule, STModule, SVModule, SEModule, DelonFormModule, QRModule]; diff --git a/src/app/shared/shared-zorro.module.ts b/src/app/shared/shared-zorro.module.ts index 53d7c243..a907ecf0 100644 --- a/src/app/shared/shared-zorro.module.ts +++ b/src/app/shared/shared-zorro.module.ts @@ -1,9 +1,3 @@ -import { NzInputNumberModule } from 'ng-zorro-antd/input-number'; -import { NzTreeModule } from 'ng-zorro-antd/tree'; -import { NzProgressModule } from 'ng-zorro-antd/progress'; -import { NzPopoverModule } from 'ng-zorro-antd/popover'; -import { NzModalModule } from 'ng-zorro-antd/modal'; -import { NzToolTipModule } from 'ng-zorro-antd/tooltip'; /* * @Author: your name * @Date: 2021-11-29 10:20:33 @@ -12,6 +6,12 @@ import { NzToolTipModule } from 'ng-zorro-antd/tooltip'; * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: \tms-obc-web\src\app\shared\shared-zorro.module.ts */ +import { NzInputNumberModule } from 'ng-zorro-antd/input-number'; +import { NzTreeModule } from 'ng-zorro-antd/tree'; +import { NzProgressModule } from 'ng-zorro-antd/progress'; +import { NzPopoverModule } from 'ng-zorro-antd/popover'; +import { NzModalModule } from 'ng-zorro-antd/modal'; +import { NzToolTipModule } from 'ng-zorro-antd/tooltip'; import { NzStepsModule } from 'ng-zorro-antd/steps'; import { NzAlertModule } from 'ng-zorro-antd/alert'; import { NzBadgeModule } from 'ng-zorro-antd/badge'; @@ -36,8 +36,9 @@ import { NzTabsModule } from 'ng-zorro-antd/tabs'; import { NzRadioModule } from 'ng-zorro-antd/radio'; import { NzTimePickerModule } from 'ng-zorro-antd/time-picker'; import { NzCheckboxModule } from 'ng-zorro-antd/checkbox'; -import { QRModule } from '@delon/abc/qr'; import { NzEmptyModule } from 'ng-zorro-antd/empty'; +import { NzStatisticModule } from 'ng-zorro-antd/statistic'; +import { NzTimelineModule } from 'ng-zorro-antd/timeline'; export const SHARED_ZORRO_MODULES = [ NzButtonModule, NzGridModule, @@ -67,7 +68,8 @@ export const SHARED_ZORRO_MODULES = [ NzTimePickerModule, NzCheckboxModule, NzInputNumberModule, - QRModule, NzPopoverModule, - NzEmptyModule + NzEmptyModule, + NzStatisticModule, + NzTimelineModule ]; diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index b14ffe68..1e10dace 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -26,6 +26,7 @@ import { MouseFocusModule } from './components/mouse-focus'; import { ScrollbarModule } from './components/scrollbar'; import { StatusLabelModule } from './components/status-label'; import { SharedThirdModule } from './shared-third.module'; +import { LogisticsTimeLineComponent } from './components/logistics-time-line/logistics-time-line.component'; const MODULES = [ AddressModule, @@ -41,6 +42,8 @@ const MODULES = [ ]; // #endregion +const SHAREDCOMPONENTS = [LogisticsTimeLineComponent]; + @NgModule({ imports: [ CommonModule, @@ -69,7 +72,9 @@ const MODULES = [ ...SHARED_ZORRO_MODULES, ...MODULES, // third libs - ...THIRDMODULES - ] + ...THIRDMODULES, + ...SHAREDCOMPONENTS + ], + declarations: SHAREDCOMPONENTS }) export class SharedModule {} diff --git a/src/environments/environment.service.ts b/src/environments/environment.service.ts index 935f7425..a0cafad7 100644 --- a/src/environments/environment.service.ts +++ b/src/environments/environment.service.ts @@ -12,7 +12,7 @@ import { Injectable } from '@angular/core'; }) export class EnvironmentService { // 应用ID - private appId = `D40B4EFC33FC4803864934872A11B0CE`; + private appId = `5800BF51DC9A494489700F09E3B81520`; // 租户ID private tenantId = `1352892699355607041`; private env: { appId: string; tenantId: string } = { appId: this.appId, tenantId: this.tenantId }; From 322aca7b43409133a6dc67d78237798d4bc05d9f Mon Sep 17 00:00:00 2001 From: wangshiming Date: Mon, 6 Dec 2021 20:23:42 +0800 Subject: [PATCH 0030/1600] =?UTF-8?q?=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bulk-detail/bulk-detail.component.html | 148 ++++++ .../bulk-detail/bulk-detail.component.less | 36 ++ .../bulk-detail/bulk-detail.component.spec.ts | 24 + .../bulk-detail/bulk-detail.component.ts | 116 +++++ .../components/bulk/bulk.component.html | 147 ++++++ .../components/bulk/bulk.component.less | 2 + .../components/bulk/bulk.component.spec.ts | 40 ++ .../components/bulk/bulk.component.ts | 477 ++++++++++++++++++ .../gaode-map/gaode-map.component.html | 6 + .../gaode-map/gaode-map.component.ts | 70 +++ .../vehicle-detail.component.html | 80 ++- .../vehicle-detail.component.less | 7 +- .../vehicle-detail.component.ts | 77 ++- .../components/vehicle/vehicle.component.html | 105 ++-- .../components/vehicle/vehicle.component.ts | 373 +++++++++----- .../order-management-routing.module.ts | 5 +- .../order-management.module.ts | 8 +- src/assets/mocks/menu-data.json | 14 +- 18 files changed, 1538 insertions(+), 197 deletions(-) create mode 100644 src/app/routes/order-management/components/bulk-detail/bulk-detail.component.html create mode 100644 src/app/routes/order-management/components/bulk-detail/bulk-detail.component.less create mode 100644 src/app/routes/order-management/components/bulk-detail/bulk-detail.component.spec.ts create mode 100644 src/app/routes/order-management/components/bulk-detail/bulk-detail.component.ts create mode 100644 src/app/routes/order-management/components/bulk/bulk.component.html create mode 100644 src/app/routes/order-management/components/bulk/bulk.component.less create mode 100644 src/app/routes/order-management/components/bulk/bulk.component.spec.ts create mode 100644 src/app/routes/order-management/components/bulk/bulk.component.ts create mode 100644 src/app/routes/order-management/components/gaode-map/gaode-map.component.html create mode 100644 src/app/routes/order-management/components/gaode-map/gaode-map.component.ts diff --git a/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.html b/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.html new file mode 100644 index 00000000..d226599c --- /dev/null +++ b/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.html @@ -0,0 +1,148 @@ + + + + + + + + +
    +
    + + {{ i?.no }} + 待接单 + + + + +
    +
    + + + + +
    +
    + +
    + {{ i?.owner }} + 32943898021309809423 + 3321944288191034921 + 18112345678 +
    + +
    +
    +
    +

    装卸货信息

    +

    装货地:广东省深圳市龙岗区怡亚通大厦

    +

    联系人:奥利给/13680058545

    +

    卸货地:广东省深圳市福田区岗厦村9巷8号405(新村)

    +

    联系人:花花世界/13680058545

    +

    发货日期:广东省深圳市福田区岗厦村9巷8号405(新村)

    +

    卸货日期:花花世界/13680058545

    +
    +
    +
    +
    +

    货物信息

    +

    货物名称:广东省深圳市龙岗区怡亚通大厦

    +

    重量/体积:广东省深圳市福田区岗厦村9巷8号405(新村)

    +

    车型/车长:花花世界/13680058545

    +
    +
    +
    +
    +

    托运信息

    +

    公司名称:广东省深圳市龙岗区怡亚通大厦

    +

    联系人:广东省深圳市福田区岗厦村9巷8号405(新村)

    +
    +
    +
    +
    +

    承运信息

    +

    司机:广东省深圳市龙岗区怡亚通大厦

    +

    车牌号:广东省深圳市福田区岗厦村9巷8号405(新村)

    +

    车型/车长/承重:{{'拖车'}} | {{'4.5米'}} | {{'15吨'}}

    +
    +
    +
    +

    补充信息

    +

    协议附件

    +

    装车附件

    +

    卸货附件

    +

    回单附件

    +
    +
    + +
    +
    +

    运费信息

    +
    +

    {{400 | currency }}

    +

    {{400 | currency }}

    +

    {{400 | currency }}

    +

    {{400 | currency }}

    +

    {{400 | currency}}

    +

    {{400 | currency }}

    +
    +
    + +
    +
    +

    {{400 | currency }}

    +

    未支付

    +
    + +
    +
    + +
    +
    +
    + 司机运输费 + 1000.00 + 未支付 +
    +
    +
    +
    + 司机运输费 + 1000.00 + 未支付 +
    +
    + 附加费 + 1000.00 + 未支付 +
    +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.less b/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.less new file mode 100644 index 00000000..3cd8c1be --- /dev/null +++ b/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.less @@ -0,0 +1,36 @@ +:host{ + .btn-size{ + font-size: 14px; + } + .bdr{ + border-right: 1px solid #ccc; + } + .bdl{ + border-left: 1px solid #ccc; + } + .source-info{ + p{ + margin-bottom: .5em; + } + } + .freight-info-box{ + width: 95%; + } + .freigth-label{ + display: inline-block; + width: 50px; + text-align: right; + } + + ::ng-deep{ + .approval-status{ + .ant-steps{ + width: 70%; + margin: 0 auto; + } + } + } + .leftPadding { + padding-right: 100px; + } +} \ No newline at end of file diff --git a/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.spec.ts b/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.spec.ts new file mode 100644 index 00000000..8556cf2d --- /dev/null +++ b/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.spec.ts @@ -0,0 +1,24 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { OrderManagementBulkeDetailComponent } from './bulk-detail.component'; + +describe('OrderManagementBulkeDetailComponent', () => { + let component: OrderManagementBulkeDetailComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ OrderManagementBulkeDetailComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderManagementBulkeDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.ts b/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.ts new file mode 100644 index 00000000..ac351533 --- /dev/null +++ b/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.ts @@ -0,0 +1,116 @@ +/* + * @Author: your name + * @Date: 2021-12-03 15:31:52 + * @LastEditTime: 2021-12-06 20:21:29 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\order-management\components\vehicle-detail\vehicle-detail.component.ts + */ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { STColumn } from '@delon/abc/st'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SupplyManagementService } from '../../services/order-management.service'; +import { OrderManagementGaodeMapComponent } from '../gaode-map/gaode-map.component'; +import * as $ from 'jquery'; +declare var AMapUI: any; +declare var AMap: any; +@Component({ + selector: 'app-supply-management-bulk-detail', + templateUrl: './bulk-detail.component.html', + styleUrls: ['./bulk-detail.component.less'] +}) +export class OrderManagementBulkeDetailComponent implements OnInit { + + id = this.route.snapshot.params.id; + i: any; + logColumns: STColumn[] = [ + { title: '时间', index: 'operationUserPhone' }, + { title: '地点', index: ' createTime' }, + ]; + + constructor( + private route: ActivatedRoute, + private msgSrv: NzMessageService, + private service: SupplyManagementService, + private modalService: NzModalService + ) { + + } + + ngOnInit(): void { + this.service.http.get(`/user/${this.id}?_allow_anonymous=true&_allow_badcode=true`).subscribe(res => { + console.log(res); + this.i = res + }); + } + + + + hand() { + this.modalService.create({ + nzTitle: '', + nzContent: OrderManagementGaodeMapComponent, + nzWidth: 1200 + }); + } + + goBack() { + window.history.go(-1); + } + + // poi选点 + PoiPicker() { + AMapUI.setDomLibrary($); + let map = new AMap.Map('container', { + zoom: 10 + }); + AMapUI.loadUI(['misc/PoiPicker'], function (PoiPicker: any) { + let poiPicker = new PoiPicker({ + // city:'北京', + input: 'pickerInput' + }); + //初始化poiPicker + (window as any).poiPicker = poiPicker; + + var marker = new AMap.Marker(); + + var infoWindow = new AMap.InfoWindow({ + offset: new AMap.Pixel(0, -20) + }); + console.log('0000') + console.log(PoiPicker) + //选取了某个POI + poiPicker.on('poiPicked', function (poiResult: any) { + console.log(1111); + console.log(poiResult) + // console.log(this.addressInput) + // this.addressInput = poiResult.item?.name + var source = poiResult.source, + poi = poiResult.item, + info = { + source: source, + id: poi.id, + name: poi.name, + location: poi.location.toString(), + address: poi.address + }; + marker.setMap(map); + infoWindow.setMap(map); + + marker.setPosition(poi.location); + infoWindow.setPosition(poi.location); + + infoWindow.setContent(`POI信息:
    ${JSON.stringify(info, null, 2)}
    `); + infoWindow.open(map, marker.getPosition()); + + map.setCenter(marker.getPosition()); + }); + poiPicker.onCityReady(() => { + // poiPicker.suggest('美食'); + }); + }); + } +} diff --git a/src/app/routes/order-management/components/bulk/bulk.component.html b/src/app/routes/order-management/components/bulk/bulk.component.html new file mode 100644 index 00000000..5d909589 --- /dev/null +++ b/src/app/routes/order-management/components/bulk/bulk.component.html @@ -0,0 +1,147 @@ + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + + + + + +
    + + + + {{item.no}} + + + +
    {{item.no}}
    +
    + +
    + {{item.no}} +
    +
    + +
    +

    预付:¥200.00

    +

    到付:¥200.00

    +

    油卡:¥200.00

    +

    回单付:¥200.00

    +

    小计:¥200.00

    +

    附加费:¥200.00

    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + +
    变更原因:
    +
    拒绝原因:
    +
    注:
    +
    + + + + +
    + + + + + +
    + 评分: +
    评价内容:
    +
    +
    + +
    + 暂无评价内容 +
    +
    +
    +
    + + + + +
    \ No newline at end of file diff --git a/src/app/routes/order-management/components/bulk/bulk.component.less b/src/app/routes/order-management/components/bulk/bulk.component.less new file mode 100644 index 00000000..29a5e65b --- /dev/null +++ b/src/app/routes/order-management/components/bulk/bulk.component.less @@ -0,0 +1,2 @@ +:host { +} \ No newline at end of file diff --git a/src/app/routes/order-management/components/bulk/bulk.component.spec.ts b/src/app/routes/order-management/components/bulk/bulk.component.spec.ts new file mode 100644 index 00000000..13642576 --- /dev/null +++ b/src/app/routes/order-management/components/bulk/bulk.component.spec.ts @@ -0,0 +1,40 @@ +/* + * @Author: your name + * @Date: 2021-12-06 20:03:28 + * @LastEditTime: 2021-12-06 20:03:29 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\order-management\components\bulk\bulk.component.spec.ts + */ +/* + * @Author: your name + * @Date: 2021-12-06 19:39:49 + * @LastEditTime: 2021-12-06 19:41:08 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\order-management\components\bulk\bulk.component.spec.ts + */ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { OrderManagementBulkComponent } from './bulk.component'; + +describe('OrderManagementBulkComponent', () => { + let component: OrderManagementBulkComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ OrderManagementBulkComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderManagementBulkComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/order-management/components/bulk/bulk.component.ts b/src/app/routes/order-management/components/bulk/bulk.component.ts new file mode 100644 index 00000000..5e0c0b35 --- /dev/null +++ b/src/app/routes/order-management/components/bulk/bulk.component.ts @@ -0,0 +1,477 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { SupplyManagementService } from '../../services/order-management.service'; + + +@Component({ + selector: 'app-supply-management-bulk', + templateUrl: './bulk.component.html', + styleUrls: ['./bulk.component.less'] +}) +export class OrderManagementBulkComponent implements OnInit { + url = `/user?_allow_anonymous=true`; + ui: SFUISchema = {}; + schema: SFSchema = {}; + auditMany = false; + isVisibleView = false; + isVisibleEvaluate = false; + isVisible = false; + _$expand = false; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('stFloat') private readonly stFloat!: STComponent; + @ViewChild('stFloatView') private readonly stFloatView!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfFre', { static: false }) sfFre!: SFComponent; + columns: STColumn[] = []; + columnsFloat: STColumn[] = []; + columnsFloatView: STColumn[] = []; + datass: any = [ + { + one: '1', + two: '1', + three: '1', + id: 1 + }, + { + one: '2', + two: '2', + three: '2', + id: 2 + }, +]; + tabs = [ { + name: '全部', + type: 5, + count: 0, + }, + { + name: '待发车', + type: 5, + count: 0, + }, + { + name: '运输中', + type: 5, + count: 0, + }, + { + name: '代签收', + type: 5, + count: 0, + }, + { + name: '已完成', + type: 5, + count: 0, + }, + { + name: '已取消', + type: 5, + count: 0, + }, + ]; + constructor(public service: SupplyManagementService, private modal: NzModalService) { } + + /** + * 查询参数 + */ + get reqParams() { + return { + ...this.sf?.value, + }; + } + get selectedRows() { + return this.st?.list.filter((item) => item.checked) || []; + } + ngOnInit(): void { + this.initSF(); + this.initST(); + this.initSTFloat(); + this.initSTFloatView(); + } + + + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + _$expand: { type: 'boolean', ui: { hidden: true } }, + no: { + type: 'string', + title: '运单号', + }, + no2: { + type: 'string', + title: '货源编号' + }, + no1: { + type: 'string', + title: '托运公司' + }, + no3: { + type: 'string', + title: '装货地', + ui: { + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + no4: { + type: 'string', + title: '卸货地', + ui: { + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + no7: { + type: 'string', + title: '承运司机', + ui: { + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + no9: { + type: 'string', + title: '车牌号', + ui: { + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + no10: { + type: 'string', + title: '收款人', + ui: { + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + sex: { + title: '支付状态', + type: 'string', + default: 0, + enum: [ + { label: '未知', value: 0 }, + { label: '男', value: 1 }, + { label: '女', value: 2 }, + { label: '保密', value: 3 }, + ], + ui: { + widget: 'select', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } as SFSelectWidgetSchema, + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } as SFDateWidgetSchema, + }, + appId: { + type: 'string', + title: '是否风险单', + ui: { + widget: 'select', + placeholder: '请选择', + visibleIf: { + _$expand: (value: boolean) => value, + }, + allowClear: true, + asyncData: () => this.getCatalogueMember(), + }, + }, + }, + type: 'object', + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { title: '', type: 'checkbox', width: '50px', className: 'text-center' }, + { + title: '运单号', + width: '100px', + className: 'text-center', + render: 'goodsId' + }, + { + title: '货源编号', + width: '100px', + className: 'text-center', + }, + { title: '托运公司', index: 'externalSn', width: '120px', className: 'text-center' }, + { title: '装货地', index: 'linkUrl', width: '120px', className: 'text-center' }, + { + title: '卸货地', + className: 'text-center', + width: '120px', + }, + { + title: '货物名称', + className: 'text-center', + width: '120px', + }, + { + title: '承运司机', + className: 'text-center', + width: '120px', + }, + { + title: '车牌号', + className: 'text-center', + width: '120px', + }, + { + title: '运费单价', + className: 'text-center', + width: '120px', + }, + { + title: '接单重量', + className: 'text-center', + width: '120px', + }, + { + title: '运费变更记录', + className: 'text-center', + width: '120px', + render: 'feiong' + }, + { + title: '结算重量', + className: 'text-center', + width: '120px', + }, + { + title: '成交金额', + className: 'text-center', + width: '120px', + render: 'enStatusStr27878' + }, + { + title: '收款人', + className: 'text-center', + width: '120px', + + }, + { + title: '支付状态', + className: 'text-center', + width: '120px', + }, + { + title: '创建时间', + className: 'text-center', + index: 'enStatusStr3', + type: 'badge', + width: '100px', + badge: { + 正常: { text: '正常', color: 'success' }, + 冻结: { text: '冻结', color: 'warning' }, + 废弃: { text: '废弃', color: 'default' }, + }, + }, + { + title: '异常原因', + className: 'text-center', + index: 'enStatusStr3', + width: '100px', + }, + { + title: '运单状态', + className: 'text-center', + index: 'enStatusStr3', + type: 'badge', + width: '100px', + badge: { + 正常: { text: '正常', color: 'success' }, + 冻结: { text: '冻结', color: 'warning' }, + 废弃: { text: '废弃', color: 'default' }, + }, + }, + { + title: '操作', + fixed: 'right', + width: '200px', + className: 'text-left', + buttons: [ + { + text: '查看评价', + click: (_record) => this.viewEvaluate(_record), + }, + ], + }, + ]; + } + initSTFloat() { + this.columnsFloat = [ + { + title: '序号', + className: 'text-center', + index: 'one', + }, + { + title: '操作时间', + className: 'text-center', + index: 'two', + }, + { + title: '操作人', + className: 'text-center', + index: 'three', + }, + { title: '状态', index: 'externalSn', className: 'text-center' }, + { + title: '操作', + fixed: 'right', + className: 'text-left', + buttons: [ + { + text: '查看', + click: (_record) => this.FloatView(_record), + }, + { + text: '撤销', + click: (_record) => this.audit(_record), + }, + ], + }, + ]; + } + initSTFloatView() { + this.columnsFloatView = [ + { + title: '费用名称', + width: '100px', + className: 'text-center', + render: 'goodsId' + }, + { + title: '变更前', + width: '100px', + className: 'text-center', + }, + { title: '变更值', index: 'externalSn', width: '120px', className: 'text-center' }, + { title: '变更后', index: 'externalSn', width: '120px', className: 'text-center' } + ]; + } + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + tabChange(item: any) { + console.log(item) + } + /** + * 重置表单 + */ + resetSF(): void { + this.sf.reset(); + this._$expand = false; + } + + + + // 获取录单员 + getCatalogueMember() { + const params = { + }; + return this.service.request(this.service.$api_get_catalogue_member, params, 'GET').pipe( + map((res) => { + if (res) { + console.log(res) + } + }), + ); + } + + selectChange(e: number) { + console.log(e); + } + /** + * 导入货源 + */ + importGoodsSource() { + + } + audit(item: any) { + console.log(item) + } + + /* + * 审核关闭弹窗 + view: 1 + 浮动费用: 0 + 查看评价: 3 + */ + handleCancel(type: string) { + console.log(type) + if(type === '0') { + this.isVisible = false + } else if(type === '1') { + console.log(type) + this.isVisibleView = false + } else if(type === '2') { + console.log(type) + this.isVisibleEvaluate = false + } + } + /** + * 审核通过按钮 + */ + handleOK() { + + } + OpenPrice() { + this.isVisible = true + } + /** + * 浮动费用查看 + */ + FloatView(item: any) { + console.log(item) + this.isVisibleView = true + } + /** + *查看评价 + */ + viewEvaluate(item: any) { + console.log(item) + this.isVisibleEvaluate = true + } +} diff --git a/src/app/routes/order-management/components/gaode-map/gaode-map.component.html b/src/app/routes/order-management/components/gaode-map/gaode-map.component.html new file mode 100644 index 00000000..47e3da45 --- /dev/null +++ b/src/app/routes/order-management/components/gaode-map/gaode-map.component.html @@ -0,0 +1,6 @@ +
    + +
    +
    diff --git a/src/app/routes/order-management/components/gaode-map/gaode-map.component.ts b/src/app/routes/order-management/components/gaode-map/gaode-map.component.ts new file mode 100644 index 00000000..81f96c8b --- /dev/null +++ b/src/app/routes/order-management/components/gaode-map/gaode-map.component.ts @@ -0,0 +1,70 @@ +import { Component, Input, OnInit, Output, EventEmitter } from '@angular/core'; +import { _HttpClient } from '@delon/theme'; +import * as $ from 'jquery'; +declare var AMapUI: any; +declare var AMap: any; + +@Component({ + selector: 'app-ordermanage-map', + templateUrl: './gaode-map.component.html' +}) +export class OrderManagementGaodeMapComponent implements OnInit { + addressInput: any; + constructor() {} + ngOnInit(): void { + this.PoiPicker(); + } + + // poi选点 + PoiPicker() { + AMapUI.setDomLibrary($); + let map = new AMap.Map('container', { + zoom: 10 + }); + AMapUI.loadUI(['misc/PoiPicker'], function (PoiPicker: any) { + let poiPicker = new PoiPicker({ + // city:'北京', + input: 'pickerInput' + }); + //初始化poiPicker + (window as any).poiPicker = poiPicker; + + var marker = new AMap.Marker(); + + var infoWindow = new AMap.InfoWindow({ + offset: new AMap.Pixel(0, -20) + }); + console.log('0000') + console.log(PoiPicker) + //选取了某个POI + poiPicker.on('poiPicked', function (poiResult: any) { + console.log(1111); + console.log(poiResult) + // console.log(this.addressInput) + // this.addressInput = poiResult.item?.name + var source = poiResult.source, + poi = poiResult.item, + info = { + source: source, + id: poi.id, + name: poi.name, + location: poi.location.toString(), + address: poi.address + }; + marker.setMap(map); + infoWindow.setMap(map); + + marker.setPosition(poi.location); + infoWindow.setPosition(poi.location); + + infoWindow.setContent(`POI信息:
    ${JSON.stringify(info, null, 2)}
    `); + infoWindow.open(map, marker.getPosition()); + + map.setCenter(marker.getPosition()); + }); + poiPicker.onCityReady(() => { + // poiPicker.suggest('美食'); + }); + }); + } +} diff --git a/src/app/routes/order-management/components/vehicle-detail/vehicle-detail.component.html b/src/app/routes/order-management/components/vehicle-detail/vehicle-detail.component.html index 61cbd133..d226599c 100644 --- a/src/app/routes/order-management/components/vehicle-detail/vehicle-detail.component.html +++ b/src/app/routes/order-management/components/vehicle-detail/vehicle-detail.component.html @@ -1,3 +1,11 @@ + - - - - - + + -
    - - -
    - - + +
    - - + + + +
    + + + + + + +
    变更原因:
    +
    拒绝原因:
    +
    注:
    +
    + + + + +
    + + + + + +
    + 评分: +
    评价内容:
    +
    +
    + +
    + 暂无评价内容 +
    +
    +
    +
    + + +
    \ No newline at end of file diff --git a/src/app/routes/order-management/components/vehicle/vehicle.component.ts b/src/app/routes/order-management/components/vehicle/vehicle.component.ts index 0c35e2fb..70cb334a 100644 --- a/src/app/routes/order-management/components/vehicle/vehicle.component.ts +++ b/src/app/routes/order-management/components/vehicle/vehicle.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit, ViewChild } from '@angular/core'; import { STColumn, STComponent } from '@delon/abc/st'; -import { SFComponent, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; import { ModalHelper, _HttpClient } from '@delon/theme'; import { NzModalService } from 'ng-zorro-antd/modal'; import { map } from 'rxjs/operators'; @@ -15,16 +15,34 @@ import { SupplyManagementService } from '../../services/order-management.service export class OrderManagementVehicleComponent implements OnInit { url = `/user?_allow_anonymous=true`; ui: SFUISchema = {}; - ui2: SFUISchema = {}; schema: SFSchema = {}; - freightSchema: SFSchema = {}; auditMany = false; + isVisibleView = false; + isVisibleEvaluate = false; isVisible = false; _$expand = false; @ViewChild('st') private readonly st!: STComponent; + @ViewChild('stFloat') private readonly stFloat!: STComponent; + @ViewChild('stFloatView') private readonly stFloatView!: STComponent; @ViewChild('sf', { static: false }) sf!: SFComponent; @ViewChild('sfFre', { static: false }) sfFre!: SFComponent; columns: STColumn[] = []; + columnsFloat: STColumn[] = []; + columnsFloatView: STColumn[] = []; + datass: any = [ + { + one: '1', + two: '1', + three: '1', + id: 1 + }, + { + one: '2', + two: '2', + three: '2', + id: 2 + }, +]; tabs = [ { name: '全部', type: 5, @@ -36,7 +54,22 @@ export class OrderManagementVehicleComponent implements OnInit { count: 0, }, { - name: '已接单', + name: '待发车', + type: 5, + count: 0, + }, + { + name: '运输中', + type: 5, + count: 0, + }, + { + name: '代签收', + type: 5, + count: 0, + }, + { + name: '已完成', type: 5, count: 0, }, @@ -62,7 +95,8 @@ export class OrderManagementVehicleComponent implements OnInit { ngOnInit(): void { this.initSF(); this.initST(); - this.initSFFre(); + this.initSTFloat(); + this.initSTFloatView(); } @@ -76,18 +110,63 @@ export class OrderManagementVehicleComponent implements OnInit { _$expand: { type: 'boolean', ui: { hidden: true } }, no: { type: 'string', - title: '货源编号', + title: '订单号', }, no2: { type: 'string', - title: '装货地' + title: '货源编号' }, no1: { type: 'string', - title: '卸货地' + title: '托运人' + }, + no3: { + type: 'string', + title: '装货地', + ui: { + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + no4: { + type: 'string', + title: '卸货地', + ui: { + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + no7: { + type: 'string', + title: '承运司机', + ui: { + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + no9: { + type: 'string', + title: '车牌号', + ui: { + visibleIf: { + _$expand: (value: boolean) => value, + }, + } + }, + no10: { + type: 'string', + title: '收款人', + ui: { + visibleIf: { + _$expand: (value: boolean) => value, + }, + } }, sex: { - title: '货物类型', + title: '支付状态', type: 'string', default: 0, enum: [ @@ -103,9 +182,21 @@ export class OrderManagementVehicleComponent implements OnInit { }, } as SFSelectWidgetSchema, }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + visibleIf: { + _$expand: (value: boolean) => value, + }, + } as SFDateWidgetSchema, + }, appId: { type: 'string', - title: '录单员', + title: '是否风险单', ui: { widget: 'select', placeholder: '请选择', @@ -119,24 +210,9 @@ export class OrderManagementVehicleComponent implements OnInit { }, type: 'object', }; - this.ui = { '*': { spanLabelFixed: 80, grid: { span: 8, gutter: 4 } } }; - } - initSFFre() { - this.freightSchema = { - properties: { - roleDescription: { - title: '备注', - type: 'string', - maxLength: 50, - ui: { - placeholder: '请输入备注', - widget: 'textarea', - }, - }, - } - }; - this.ui2 = { '*': { spanLabelFixed: 120, grid: { span: 24 } } }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; } + /** * 初始化数据列表 */ @@ -144,23 +220,19 @@ export class OrderManagementVehicleComponent implements OnInit { this.columns = [ { title: '', type: 'checkbox', width: '50px', className: 'text-center' }, { - title: '货源编号', + title: '运单号', width: '100px', className: 'text-center', render: 'goodsId' }, - { title: '服务类型', index: 'externalSn', width: '120px', className: 'text-center' }, - { title: '货主', index: 'linkUrl', width: '120px', className: 'text-center' }, { - title: '项目名称', + title: '货源编号', + width: '100px', className: 'text-center', - width: '120px', }, + { title: '托运人', index: 'externalSn', width: '120px', className: 'text-center' }, + { title: '装货地', index: 'linkUrl', width: '120px', className: 'text-center' }, { - title: '装货地', - className: 'text-center', - width: '120px', - }, { title: '卸货地', className: 'text-center', width: '120px', @@ -169,34 +241,44 @@ export class OrderManagementVehicleComponent implements OnInit { title: '货物名称', className: 'text-center', width: '120px', - }, - { - title: '货物数量', + }, { + title: '重量/体积', className: 'text-center', width: '120px', }, { - title: '用车需求', + title: '承运司机', className: 'text-center', width: '120px', }, { - title: '总费用', + title: '车牌号', + className: 'text-center', + width: '120px', + }, + { + title: '出价', className: 'text-center', width: '120px', - index: 'goodsId', render: 'enStatusStr27878' }, { - title: '附加费', + title: '浮动费用', + className: 'text-center', + width: '120px', + render: 'feiong' + }, + { + title: '成交金额', className: 'text-center', width: '120px', }, { - title: '货源状态', + title: '收款人', className: 'text-center', index: 'enStatusStr2', type: 'badge', + width: '100px', badge: { 正常: { text: '正常', color: 'success' }, 冻结: { text: '冻结', color: 'warning' }, @@ -204,15 +286,40 @@ export class OrderManagementVehicleComponent implements OnInit { }, }, { - title: '创建时间', + title: '支付状态', width: '170px', className: 'text-center', }, { - title: '审核状态', + title: '创建时间', className: 'text-center', index: 'enStatusStr3', type: 'badge', + width: '100px', + badge: { + 正常: { text: '正常', color: 'success' }, + 冻结: { text: '冻结', color: 'warning' }, + 废弃: { text: '废弃', color: 'default' }, + }, + }, + { + title: '异常原因', + className: 'text-center', + index: 'enStatusStr3', + type: 'badge', + width: '100px', + badge: { + 正常: { text: '正常', color: 'success' }, + 冻结: { text: '冻结', color: 'warning' }, + 废弃: { text: '废弃', color: 'default' }, + }, + }, + { + title: '运单状态', + className: 'text-center', + index: 'enStatusStr3', + type: 'badge', + width: '100px', badge: { 正常: { text: '正常', color: 'success' }, 冻结: { text: '冻结', color: 'warning' }, @@ -223,40 +330,67 @@ export class OrderManagementVehicleComponent implements OnInit { title: '操作', fixed: 'right', width: '200px', - className: 'text-center', + className: 'text-left', buttons: [ { - text: '货源审核', - click: (_record) => this.audit(_record, 1), - }, - { - text: '修改货源', - // click: (_record) => this.editOne(_record), - }, - { - text: '修改运费', - click: (_record) => this.updateFreight(_record), - }, - { - text: '取消货源', - // click: (_record) => this.delOne(_record), - }, - { - text: '再下一单', - // click: (_record) => this.editOne(_record), - }, - { - text: '重新指派', - click: (_record) => this.assignedCar(_record), + text: '查看评价', + click: (_record) => this.viewEvaluate(_record), }, ], }, ]; } - add(): void { - // this.modal - // .createStatic(FormEditComponent, { i: { id: 0 } }) - // .subscribe(() => this.st.reload()); + initSTFloat() { + this.columnsFloat = [ + { + title: '序号', + className: 'text-center', + index: 'one', + }, + { + title: '操作时间', + className: 'text-center', + index: 'two', + }, + { + title: '操作人', + className: 'text-center', + index: 'three', + }, + { title: '状态', index: 'externalSn', className: 'text-center' }, + { + title: '操作', + fixed: 'right', + className: 'text-left', + buttons: [ + { + text: '查看', + click: (_record) => this.FloatView(_record), + }, + { + text: '撤销', + click: (_record) => this.audit(_record), + }, + ], + }, + ]; + } + initSTFloatView() { + this.columnsFloatView = [ + { + title: '费用名称', + width: '100px', + className: 'text-center', + render: 'goodsId' + }, + { + title: '变更前', + width: '100px', + className: 'text-center', + }, + { title: '变更值', index: 'externalSn', width: '120px', className: 'text-center' }, + { title: '变更后', index: 'externalSn', width: '120px', className: 'text-center' } + ]; } /** * 查询字段个数 @@ -300,77 +434,33 @@ export class OrderManagementVehicleComponent implements OnInit { selectChange(e: number) { console.log(e); } - - /** - * 编辑外部货源号 - * @param item st当前行对象 - */ - editEnternalSn(item: any) { - const modalRef = this.modal.create({ - nzWidth: '400px', - // nzContent: SupplyManagementUpdateExternalSnComponent, - nzComponentParams: { - orderObject: item, - }, - nzFooter: null, - nzClosable: false - }); - } - /** * 导入货源 */ importGoodsSource() { } - - /** - * 修改运费 - */ - updateFreight(item: any) { - const modalRef = this.modal.create({ - nzTitle: '修改运费', - nzWidth: '40%', - // nzContent: SupplyManagementUpdateFreightComponent, - nzComponentParams: { - i: item, - }, - nzFooter: null, - }); + audit(item: any) { + console.log(item) } - /** - * 重新指派 - */ - assignedCar(item: any) { - const modalRef = this.modal.create({ - nzTitle: '指派熟车', - nzWidth: '800px', - // nzContent: SupplyManagementAssignedCarComponent, - nzComponentParams: { - i: item, - }, - nzFooter: null, - }); - } - /** - * 审核 - */ - audit(value: any, status?: any) { - console.log(value) - console.log(status) - if(status === 2) { - this.auditMany = true; - } else { - this.auditMany = false; - } - this.isVisible = true; - } - /** + /* * 审核关闭弹窗 + view: 1 + 浮动费用: 0 + 查看评价: 3 */ - handleCancel(type: any) { + handleCancel(type: string) { + console.log(type) + if(type === '0') { this.isVisible = false + } else if(type === '1') { + console.log(type) + this.isVisibleView = false + } else if(type === '2') { + console.log(type) + this.isVisibleEvaluate = false + } } /** * 审核通过按钮 @@ -378,4 +468,21 @@ export class OrderManagementVehicleComponent implements OnInit { handleOK() { } + OpenPrice() { + this.isVisible = true + } + /** + * 浮动费用查看 + */ + FloatView(item: any) { + console.log(item) + this.isVisibleView = true + } + /** + *查看评价 + */ + viewEvaluate(item: any) { + console.log(item) + this.isVisibleEvaluate = true + } } diff --git a/src/app/routes/order-management/order-management-routing.module.ts b/src/app/routes/order-management/order-management-routing.module.ts index 78517b5c..33b595da 100644 --- a/src/app/routes/order-management/order-management-routing.module.ts +++ b/src/app/routes/order-management/order-management-routing.module.ts @@ -1,19 +1,22 @@ /* * @Author: your name * @Date: 2021-12-03 15:31:52 - * @LastEditTime: 2021-12-03 16:02:33 + * @LastEditTime: 2021-12-06 20:21:41 * @LastEditors: Please set LastEditors * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: \tms-obc-web\src\app\routes\order-management\order-management-routing.module.ts */ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; +import { OrderManagementBulkComponent } from './components/bulk/bulk.component'; import { OrderManagementVehicleDetailComponent } from './components/vehicle-detail/vehicle-detail.component'; import { OrderManagementVehicleComponent } from './components/vehicle/vehicle.component'; const routes: Routes = [ { path: 'vehicle', component: OrderManagementVehicleComponent }, { path: 'vehicle-detail/:id', component: OrderManagementVehicleDetailComponent }, + { path: 'bulk', component: OrderManagementBulkComponent }, + { path: 'bulk-detail/:id', component: OrderManagementVehicleDetailComponent }, ] @NgModule({ imports: [RouterModule.forChild(routes)], diff --git a/src/app/routes/order-management/order-management.module.ts b/src/app/routes/order-management/order-management.module.ts index 8d477b95..816f6970 100644 --- a/src/app/routes/order-management/order-management.module.ts +++ b/src/app/routes/order-management/order-management.module.ts @@ -1,5 +1,8 @@ import { NgModule, Type } from '@angular/core'; import { SharedModule } from '@shared'; +import { OrderManagementBulkeDetailComponent } from './components/bulk-detail/bulk-detail.component'; +import { OrderManagementBulkComponent } from './components/bulk/bulk.component'; +import { OrderManagementGaodeMapComponent } from './components/gaode-map/gaode-map.component'; import { OrderManagementVehicleDetailComponent } from './components/vehicle-detail/vehicle-detail.component'; import { OrderManagementVehicleComponent } from './components/vehicle/vehicle.component'; @@ -7,7 +10,10 @@ import { OrderManagementRoutingModule } from './order-management-routing.module' const COMPONENTS: Type[] = [ OrderManagementVehicleComponent, - OrderManagementVehicleDetailComponent + OrderManagementVehicleDetailComponent, + OrderManagementGaodeMapComponent, + OrderManagementBulkComponent, + OrderManagementBulkeDetailComponent ]; @NgModule({ diff --git a/src/assets/mocks/menu-data.json b/src/assets/mocks/menu-data.json index e6410b6f..7fbdce04 100644 --- a/src/assets/mocks/menu-data.json +++ b/src/assets/mocks/menu-data.json @@ -171,18 +171,30 @@ "text": "订单管理", "icon": "anticon anticon-dashboard", "group": true, - "children": [{ + "children": [ + { "text": "整车订单", "icon": "anticon anticon-dashboard", "link": "/order-management/vehicle", "reuse": true }, + { + "text": "大宗订单", + "icon": "anticon anticon-dashboard", + "link": "/order-management/bulk" + }, { "text": "整车订单详情", "icon": "anticon anticon-dashboard", "link": "/order-management/vehicle-detail/:id", "hide": true }, + { + "text": "大宗订单详情", + "icon": "anticon anticon-dashboard", + "link": "/order-management/bulk-detail/:id", + "hide": true + }, { "text": "货源详情", "icon": "anticon anticon-dashboard", From 1d79ed291c16b4b7d63d19e1864593d5291b188a Mon Sep 17 00:00:00 2001 From: Taric Xin Date: Mon, 6 Dec 2021 20:28:01 +0800 Subject: [PATCH 0031/1600] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 23 +--- package.json | 3 +- .../gaode-map/gaode-map.component.html | 2 +- .../gaode-map/gaode-map.component.ts | 111 +++++++++--------- src/index.html | 103 ++++++++-------- src/style-icons-auto.ts | 6 +- 6 files changed, 117 insertions(+), 131 deletions(-) diff --git a/package-lock.json b/package-lock.json index ceabf34c..e6644c58 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,11 @@ } } }, + "@amap/amap-jsapi-loader": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/@amap/amap-jsapi-loader/download/@amap/amap-jsapi-loader-1.0.1.tgz", + "integrity": "sha1-nsS01dJGfqxFH2yFLjXbaen58MA=" + }, "@ampproject/remapping": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/@ampproject/remapping/download/@ampproject/remapping-1.0.1.tgz", @@ -2803,14 +2808,6 @@ "@types/jasmine": "*" } }, - "@types/jquery": { - "version": "3.5.9", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.9.tgz", - "integrity": "sha512-B8pDk+sH/tSv/HKdx6EQER6BfUOb2GtKs0LOmozziS4h7cbe8u/eYySfUAeTwD+J09SqV3man7AMWIA5mgzCBA==", - "requires": { - "@types/sizzle": "*" - } - }, "@types/js-base64": { "version": "3.3.1", "resolved": "https://registry.npmmirror.com/@types/js-base64/download/@types/js-base64-3.3.1.tgz", @@ -2888,11 +2885,6 @@ "integrity": "sha1-KOzt528VsTVTtOhgdNTPmgu+ScQ=", "dev": true }, - "@types/sizzle": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", - "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==" - }, "@types/source-list-map": { "version": "0.1.2", "resolved": "https://registry.npmmirror.com/@types/source-list-map/download/@types/source-list-map-0.1.2.tgz?cache=0&sync_timestamp=1637284095686&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fsource-list-map%2Fdownload%2F%40types%2Fsource-list-map-0.1.2.tgz", @@ -9344,11 +9336,6 @@ } } }, - "jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" - }, "js-base64": { "version": "3.7.2", "resolved": "https://registry.npmmirror.com/js-base64/download/js-base64-3.7.2.tgz", diff --git a/package.json b/package.json index 4dc5516c..66149bde 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ }, "dependencies": { "@agm/core": "^1.1.0", + "@amap/amap-jsapi-loader": "^1.0.1", "@angular/animations": "~12.2.0", "@angular/common": "~12.2.0", "@angular/compiler": "~12.2.0", @@ -55,8 +56,6 @@ "ajv": "^8.6.2", "angular-baidu-maps": "^12.0.0", "file-saver": "^2.0.5", - "@types/jquery": "^3.5.9", - "jquery": "^3.6.0", "js-base64": "^3.6.1", "masonry-layout": "^4.2.2", "ng-gallery": "^5.0.0", diff --git a/src/app/routes/supply-management/components/gaode-map/gaode-map.component.html b/src/app/routes/supply-management/components/gaode-map/gaode-map.component.html index 3088f6f1..1a26554b 100644 --- a/src/app/routes/supply-management/components/gaode-map/gaode-map.component.html +++ b/src/app/routes/supply-management/components/gaode-map/gaode-map.component.html @@ -3,4 +3,4 @@ -
    +
    diff --git a/src/app/routes/supply-management/components/gaode-map/gaode-map.component.ts b/src/app/routes/supply-management/components/gaode-map/gaode-map.component.ts index f84c4064..f95d253d 100644 --- a/src/app/routes/supply-management/components/gaode-map/gaode-map.component.ts +++ b/src/app/routes/supply-management/components/gaode-map/gaode-map.component.ts @@ -1,70 +1,65 @@ -import { Component, Input, OnInit, Output, EventEmitter } from '@angular/core'; +import { Component, Input, OnInit, Output, EventEmitter, OnDestroy } from '@angular/core'; import { _HttpClient } from '@delon/theme'; -import * as $ from 'jquery'; -declare var AMapUI: any; -declare var AMap: any; - +import { load } from '@amap/amap-jsapi-loader'; +import { BaseService } from 'src/app/shared/services'; +import { throwError } from 'rxjs'; +import AMapLoader from '@amap/amap-jsapi-loader'; @Component({ selector: 'app-gaode-map', templateUrl: './gaode-map.component.html' }) -export class GaodeMapComponent implements OnInit { +export class GaodeMapComponent implements OnInit, OnDestroy { addressInput: any; - constructor() {} + + aMap: any; + constructor(private service: BaseService) {} ngOnInit(): void { - this.PoiPicker(); + this.mapInit(); + // this.PoiPicker(); } - // poi选点 - PoiPicker() { - AMapUI.setDomLibrary($); - let map = new AMap.Map('container', { - zoom: 10 - }); - AMapUI.loadUI(['misc/PoiPicker'], function (PoiPicker: any) { - let poiPicker = new PoiPicker({ - // city:'北京', - input: 'pickerInput' + ngOnDestroy(): void { + if (this.aMap) { + this.aMap.destroy(); + } + } + + mapInit() { + AMapLoader.load({ + // 首次调用 load + key: '63f9573ca55fef2b92d4ffe0c85dea8f', // 申请好的Web端开发者Key,首次调用 load 时必填 + version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15 + plugins: [ + // 需要使用的的插件列表,如比例尺'AMap.Scale'等 + 'AMap.Scale', + 'AMap.ToolBar', + 'AMap.MapType', + 'AMap.Driving', + 'AMap.Geolocation' + ], + AMapUI: { + // 是否加载 AMapUI,缺省不加载 + version: '1.1', // AMapUI 缺省 1.1 + plugins: [] // 需要加载的 AMapUI ui插件 + }, + Loca: { + // 是否加载 Loca, 缺省不加载 + version: '2.0' // Loca 版本,缺省 1.3.2 + } + }) + .then(AMap => { + console.log(AMap); + + this.aMap = new AMap.Map('container', { + viewMode: '2D', // 默认使用 2D 模式,如果希望使用带有俯仰角的 3D 模式,请设置 viewMode: '3D', + zoom: 16 + }); + this.aMap.on('complete', () => { + this.service.msgSrv.info('地图加载完成 !'); + }); + }) + .catch(e => { + throwError(e); }); - //初始化poiPicker - (window as any).poiPicker = poiPicker; - - var marker = new AMap.Marker(); - - var infoWindow = new AMap.InfoWindow({ - offset: new AMap.Pixel(0, -20) - }); - console.log('0000') - console.log(PoiPicker) - //选取了某个POI - poiPicker.on('poiPicked', function (poiResult: any) { - console.log(1111); - console.log(poiResult) - // console.log(this.addressInput) - // this.addressInput = poiResult.item?.name - var source = poiResult.source, - poi = poiResult.item, - info = { - source: source, - id: poi.id, - name: poi.name, - location: poi.location.toString(), - address: poi.address - }; - marker.setMap(map); - infoWindow.setMap(map); - - marker.setPosition(poi.location); - infoWindow.setPosition(poi.location); - - infoWindow.setContent(`POI信息:
    ${JSON.stringify(info, null, 2)}
    `); - infoWindow.open(map, marker.getPosition()); - - map.setCenter(marker.getPosition()); - }); - poiPicker.onCityReady(() => { - // poiPicker.suggest('美食'); - }); - }); } } diff --git a/src/index.html b/src/index.html index c8f4871e..543758d5 100644 --- a/src/index.html +++ b/src/index.html @@ -8,56 +8,59 @@ --> - - - Ng Alain Pro - - - - - - - - - - -
    -
    - -
    + + + Ng Alain Pro + + + + + + + + + + + +
    +
    +
    - +
    + + - - - + \ No newline at end of file diff --git a/src/style-icons-auto.ts b/src/style-icons-auto.ts index f5a95b10..3668fed2 100644 --- a/src/style-icons-auto.ts +++ b/src/style-icons-auto.ts @@ -54,7 +54,8 @@ import { WeiboCircleOutline, EyeInvisibleOutline, MoreOutline, - MenuOutline + MenuOutline, + SwapOutline } from '@ant-design/icons-angular/icons'; export const ICONS_AUTO = [ @@ -108,5 +109,6 @@ export const ICONS_AUTO = [ WeiboCircleOutline, EyeInvisibleOutline, MoreOutline, - MenuOutline + MenuOutline, + SwapOutline ]; From df352618aac9b2167adbaa8229357a7993908900 Mon Sep 17 00:00:00 2001 From: wangshiming Date: Mon, 6 Dec 2021 20:37:41 +0800 Subject: [PATCH 0032/1600] =?UTF-8?q?=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bulk-detail/bulk-detail.component.ts | 60 +--------- .../gaode-map/gaode-map.component.html | 6 +- .../gaode-map/gaode-map.component.ts | 113 +++++++++--------- .../vehicle-detail.component.ts | 60 +--------- .../order-management.module.ts | 2 - 5 files changed, 61 insertions(+), 180 deletions(-) diff --git a/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.ts b/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.ts index ac351533..abf5ac38 100644 --- a/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.ts +++ b/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.ts @@ -1,7 +1,7 @@ /* * @Author: your name * @Date: 2021-12-03 15:31:52 - * @LastEditTime: 2021-12-06 20:21:29 + * @LastEditTime: 2021-12-06 20:34:08 * @LastEditors: Please set LastEditors * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: \tms-obc-web\src\app\routes\order-management\components\vehicle-detail\vehicle-detail.component.ts @@ -13,10 +13,6 @@ import { _HttpClient } from '@delon/theme'; import { NzMessageService } from 'ng-zorro-antd/message'; import { NzModalService } from 'ng-zorro-antd/modal'; import { SupplyManagementService } from '../../services/order-management.service'; -import { OrderManagementGaodeMapComponent } from '../gaode-map/gaode-map.component'; -import * as $ from 'jquery'; -declare var AMapUI: any; -declare var AMap: any; @Component({ selector: 'app-supply-management-bulk-detail', templateUrl: './bulk-detail.component.html', @@ -52,7 +48,7 @@ export class OrderManagementBulkeDetailComponent implements OnInit { hand() { this.modalService.create({ nzTitle: '', - nzContent: OrderManagementGaodeMapComponent, + // nzContent: OrderManagementGaodeMapComponent, nzWidth: 1200 }); } @@ -61,56 +57,4 @@ export class OrderManagementBulkeDetailComponent implements OnInit { window.history.go(-1); } - // poi选点 - PoiPicker() { - AMapUI.setDomLibrary($); - let map = new AMap.Map('container', { - zoom: 10 - }); - AMapUI.loadUI(['misc/PoiPicker'], function (PoiPicker: any) { - let poiPicker = new PoiPicker({ - // city:'北京', - input: 'pickerInput' - }); - //初始化poiPicker - (window as any).poiPicker = poiPicker; - - var marker = new AMap.Marker(); - - var infoWindow = new AMap.InfoWindow({ - offset: new AMap.Pixel(0, -20) - }); - console.log('0000') - console.log(PoiPicker) - //选取了某个POI - poiPicker.on('poiPicked', function (poiResult: any) { - console.log(1111); - console.log(poiResult) - // console.log(this.addressInput) - // this.addressInput = poiResult.item?.name - var source = poiResult.source, - poi = poiResult.item, - info = { - source: source, - id: poi.id, - name: poi.name, - location: poi.location.toString(), - address: poi.address - }; - marker.setMap(map); - infoWindow.setMap(map); - - marker.setPosition(poi.location); - infoWindow.setPosition(poi.location); - - infoWindow.setContent(`POI信息:
    ${JSON.stringify(info, null, 2)}
    `); - infoWindow.open(map, marker.getPosition()); - - map.setCenter(marker.getPosition()); - }); - poiPicker.onCityReady(() => { - // poiPicker.suggest('美食'); - }); - }); - } } diff --git a/src/app/routes/order-management/components/gaode-map/gaode-map.component.html b/src/app/routes/order-management/components/gaode-map/gaode-map.component.html index 47e3da45..1a26554b 100644 --- a/src/app/routes/order-management/components/gaode-map/gaode-map.component.html +++ b/src/app/routes/order-management/components/gaode-map/gaode-map.component.html @@ -1,6 +1,6 @@
    - +
    -
    +
    diff --git a/src/app/routes/order-management/components/gaode-map/gaode-map.component.ts b/src/app/routes/order-management/components/gaode-map/gaode-map.component.ts index 81f96c8b..f95d253d 100644 --- a/src/app/routes/order-management/components/gaode-map/gaode-map.component.ts +++ b/src/app/routes/order-management/components/gaode-map/gaode-map.component.ts @@ -1,70 +1,65 @@ -import { Component, Input, OnInit, Output, EventEmitter } from '@angular/core'; +import { Component, Input, OnInit, Output, EventEmitter, OnDestroy } from '@angular/core'; import { _HttpClient } from '@delon/theme'; -import * as $ from 'jquery'; -declare var AMapUI: any; -declare var AMap: any; - +import { load } from '@amap/amap-jsapi-loader'; +import { BaseService } from 'src/app/shared/services'; +import { throwError } from 'rxjs'; +import AMapLoader from '@amap/amap-jsapi-loader'; @Component({ - selector: 'app-ordermanage-map', + selector: 'app-gaode-map', templateUrl: './gaode-map.component.html' }) -export class OrderManagementGaodeMapComponent implements OnInit { +export class GaodeMapComponent implements OnInit, OnDestroy { addressInput: any; - constructor() {} + + aMap: any; + constructor(private service: BaseService) {} ngOnInit(): void { - this.PoiPicker(); + this.mapInit(); + // this.PoiPicker(); } - // poi选点 - PoiPicker() { - AMapUI.setDomLibrary($); - let map = new AMap.Map('container', { - zoom: 10 - }); - AMapUI.loadUI(['misc/PoiPicker'], function (PoiPicker: any) { - let poiPicker = new PoiPicker({ - // city:'北京', - input: 'pickerInput' + ngOnDestroy(): void { + if (this.aMap) { + this.aMap.destroy(); + } + } + + mapInit() { + AMapLoader.load({ + // 首次调用 load + key: '63f9573ca55fef2b92d4ffe0c85dea8f', // 申请好的Web端开发者Key,首次调用 load 时必填 + version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15 + plugins: [ + // 需要使用的的插件列表,如比例尺'AMap.Scale'等 + 'AMap.Scale', + 'AMap.ToolBar', + 'AMap.MapType', + 'AMap.Driving', + 'AMap.Geolocation' + ], + AMapUI: { + // 是否加载 AMapUI,缺省不加载 + version: '1.1', // AMapUI 缺省 1.1 + plugins: [] // 需要加载的 AMapUI ui插件 + }, + Loca: { + // 是否加载 Loca, 缺省不加载 + version: '2.0' // Loca 版本,缺省 1.3.2 + } + }) + .then(AMap => { + console.log(AMap); + + this.aMap = new AMap.Map('container', { + viewMode: '2D', // 默认使用 2D 模式,如果希望使用带有俯仰角的 3D 模式,请设置 viewMode: '3D', + zoom: 16 + }); + this.aMap.on('complete', () => { + this.service.msgSrv.info('地图加载完成 !'); + }); + }) + .catch(e => { + throwError(e); }); - //初始化poiPicker - (window as any).poiPicker = poiPicker; - - var marker = new AMap.Marker(); - - var infoWindow = new AMap.InfoWindow({ - offset: new AMap.Pixel(0, -20) - }); - console.log('0000') - console.log(PoiPicker) - //选取了某个POI - poiPicker.on('poiPicked', function (poiResult: any) { - console.log(1111); - console.log(poiResult) - // console.log(this.addressInput) - // this.addressInput = poiResult.item?.name - var source = poiResult.source, - poi = poiResult.item, - info = { - source: source, - id: poi.id, - name: poi.name, - location: poi.location.toString(), - address: poi.address - }; - marker.setMap(map); - infoWindow.setMap(map); - - marker.setPosition(poi.location); - infoWindow.setPosition(poi.location); - - infoWindow.setContent(`POI信息:
    ${JSON.stringify(info, null, 2)}
    `); - infoWindow.open(map, marker.getPosition()); - - map.setCenter(marker.getPosition()); - }); - poiPicker.onCityReady(() => { - // poiPicker.suggest('美食'); - }); - }); } } diff --git a/src/app/routes/order-management/components/vehicle-detail/vehicle-detail.component.ts b/src/app/routes/order-management/components/vehicle-detail/vehicle-detail.component.ts index 62df3b0c..89371f0a 100644 --- a/src/app/routes/order-management/components/vehicle-detail/vehicle-detail.component.ts +++ b/src/app/routes/order-management/components/vehicle-detail/vehicle-detail.component.ts @@ -1,7 +1,7 @@ /* * @Author: your name * @Date: 2021-12-03 15:31:52 - * @LastEditTime: 2021-12-06 19:36:24 + * @LastEditTime: 2021-12-06 20:34:43 * @LastEditors: Please set LastEditors * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: \tms-obc-web\src\app\routes\order-management\components\vehicle-detail\vehicle-detail.component.ts @@ -13,10 +13,6 @@ import { _HttpClient } from '@delon/theme'; import { NzMessageService } from 'ng-zorro-antd/message'; import { NzModalService } from 'ng-zorro-antd/modal'; import { SupplyManagementService } from '../../services/order-management.service'; -import { OrderManagementGaodeMapComponent } from '../gaode-map/gaode-map.component'; -import * as $ from 'jquery'; -declare var AMapUI: any; -declare var AMap: any; @Component({ selector: 'app-supply-management-vehicle-detail', templateUrl: './vehicle-detail.component.html', @@ -52,7 +48,7 @@ export class OrderManagementVehicleDetailComponent implements OnInit { hand() { this.modalService.create({ nzTitle: '', - nzContent: OrderManagementGaodeMapComponent, + // nzContent: OrderManagementGaodeMapComponent, nzWidth: 1200 }); } @@ -61,56 +57,4 @@ export class OrderManagementVehicleDetailComponent implements OnInit { window.history.go(-1); } - // poi选点 - PoiPicker() { - AMapUI.setDomLibrary($); - let map = new AMap.Map('container', { - zoom: 10 - }); - AMapUI.loadUI(['misc/PoiPicker'], function (PoiPicker: any) { - let poiPicker = new PoiPicker({ - // city:'北京', - input: 'pickerInput' - }); - //初始化poiPicker - (window as any).poiPicker = poiPicker; - - var marker = new AMap.Marker(); - - var infoWindow = new AMap.InfoWindow({ - offset: new AMap.Pixel(0, -20) - }); - console.log('0000') - console.log(PoiPicker) - //选取了某个POI - poiPicker.on('poiPicked', function (poiResult: any) { - console.log(1111); - console.log(poiResult) - // console.log(this.addressInput) - // this.addressInput = poiResult.item?.name - var source = poiResult.source, - poi = poiResult.item, - info = { - source: source, - id: poi.id, - name: poi.name, - location: poi.location.toString(), - address: poi.address - }; - marker.setMap(map); - infoWindow.setMap(map); - - marker.setPosition(poi.location); - infoWindow.setPosition(poi.location); - - infoWindow.setContent(`POI信息:
    ${JSON.stringify(info, null, 2)}
    `); - infoWindow.open(map, marker.getPosition()); - - map.setCenter(marker.getPosition()); - }); - poiPicker.onCityReady(() => { - // poiPicker.suggest('美食'); - }); - }); - } } diff --git a/src/app/routes/order-management/order-management.module.ts b/src/app/routes/order-management/order-management.module.ts index 816f6970..d64cc239 100644 --- a/src/app/routes/order-management/order-management.module.ts +++ b/src/app/routes/order-management/order-management.module.ts @@ -2,7 +2,6 @@ import { NgModule, Type } from '@angular/core'; import { SharedModule } from '@shared'; import { OrderManagementBulkeDetailComponent } from './components/bulk-detail/bulk-detail.component'; import { OrderManagementBulkComponent } from './components/bulk/bulk.component'; -import { OrderManagementGaodeMapComponent } from './components/gaode-map/gaode-map.component'; import { OrderManagementVehicleDetailComponent } from './components/vehicle-detail/vehicle-detail.component'; import { OrderManagementVehicleComponent } from './components/vehicle/vehicle.component'; @@ -11,7 +10,6 @@ import { OrderManagementRoutingModule } from './order-management-routing.module' const COMPONENTS: Type[] = [ OrderManagementVehicleComponent, OrderManagementVehicleDetailComponent, - OrderManagementGaodeMapComponent, OrderManagementBulkComponent, OrderManagementBulkeDetailComponent ]; From fb71a1a066979839c61207feb90d6c778239fb6a Mon Sep 17 00:00:00 2001 From: wangshiming Date: Mon, 6 Dec 2021 21:06:19 +0800 Subject: [PATCH 0033/1600] =?UTF-8?q?=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bulk-detail/bulk-detail.component.html | 3 +- .../components/bulk/bulk.component.html | 10 +++- .../components/bulk/bulk.component.less | 9 +++- .../components/bulk/bulk.component.ts | 47 +++++++++++++++++++ .../vehicle-detail.component.html | 3 +- .../components/vehicle/vehicle.component.html | 4 +- 6 files changed, 67 insertions(+), 9 deletions(-) diff --git a/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.html b/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.html index d226599c..8c2e348d 100644 --- a/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.html +++ b/src/app/routes/order-management/components/bulk-detail/bulk-detail.component.html @@ -1,7 +1,7 @@ -
    diff --git a/src/app/routes/order-management/components/bulk/bulk.component.html b/src/app/routes/order-management/components/bulk/bulk.component.html index 5d909589..620c3b61 100644 --- a/src/app/routes/order-management/components/bulk/bulk.component.html +++ b/src/app/routes/order-management/components/bulk/bulk.component.html @@ -1,7 +1,7 @@ -
    diff --git a/src/app/routes/order-management/components/vehicle/vehicle.component.html b/src/app/routes/order-management/components/vehicle/vehicle.component.html index fe67124f..4d9b4ffe 100644 --- a/src/app/routes/order-management/components/vehicle/vehicle.component.html +++ b/src/app/routes/order-management/components/vehicle/vehicle.component.html @@ -1,7 +1,7 @@ + + +
    + +
    + +
    + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + + + + + +
    + + + + {{item.no}} + + +
    +
    + + + + + + {{ infoData1?.enterpriseName }} + {{ infoData1?.unifiedSocialCreditCode }} + {{ infoData1?.enterpriseType }} + {{ infoData1?.registrationCapital }} 万元 + {{ infoData1?.enterpriseRegistrationTime }} + + {{ infoData1?.enterpriseRegistrationTime }} + + + + + {{ infoData1?.enterpriseAddress }} + + + + {{ infoData1?.businessScope }} + + + + {{ infoData1?.businessScope }} + 已临期 + + + + + + + + diff --git a/src/app/routes/order-management/components/driver-manage/driver-manage.component.less b/src/app/routes/order-management/components/driver-manage/driver-manage.component.less new file mode 100644 index 00000000..30444d6b --- /dev/null +++ b/src/app/routes/order-management/components/driver-manage/driver-manage.component.less @@ -0,0 +1,7 @@ + .left_btn { + width: 50px; + height: 32px; + padding-left: 8px; + line-height:32px; + background-color: #d7d7d7; + } \ No newline at end of file diff --git a/src/app/routes/order-management/components/driver-manage/driver-manage.component.spec.ts b/src/app/routes/order-management/components/driver-manage/driver-manage.component.spec.ts new file mode 100644 index 00000000..bd6e2009 --- /dev/null +++ b/src/app/routes/order-management/components/driver-manage/driver-manage.component.spec.ts @@ -0,0 +1,40 @@ +/* + * @Author: your name + * @Date: 2021-12-06 20:03:28 + * @LastEditTime: 2021-12-06 20:03:29 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\order-management\components\bulk\bulk.component.spec.ts + */ +/* + * @Author: your name + * @Date: 2021-12-06 19:39:49 + * @LastEditTime: 2021-12-06 19:41:08 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\order-management\components\bulk\bulk.component.spec.ts + */ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { OrderManagementDriverManageComponent } from './driver-manage.component'; + +describe('OrderManagementDriverManageComponent', () => { + let component: OrderManagementDriverManageComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ OrderManagementDriverManageComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderManagementDriverManageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/order-management/components/driver-manage/driver-manage.component.ts b/src/app/routes/order-management/components/driver-manage/driver-manage.component.ts new file mode 100644 index 00000000..d685b910 --- /dev/null +++ b/src/app/routes/order-management/components/driver-manage/driver-manage.component.ts @@ -0,0 +1,283 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { SupplyManagementService } from '../../services/order-management.service'; + + +@Component({ + selector: 'app-supply-management-driver-manage', + templateUrl: './driver-manage.component.html', + styleUrls: ['./driver-manage.component.less'] +}) +export class OrderManagementDriverManageComponent implements OnInit { + url = `/user?_allow_anonymous=true`; + ui: SFUISchema = {}; + uiView: SFUISchema = {}; + schema: SFSchema = {}; + auditMany = false; + isVisibleView = false; + isVisible = false; + _$expand = false; + infoData1: any; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + columns: STColumn[] = []; + demoValue: any; + datass: any = [ + { + one: '1', + two: '1', + three: '1', + id: 1 + }, + { + one: '2', + two: '2', + three: '2', + id: 2 + }, +]; + tabs = [ { + name: '全部', + type: 5, + count: 0, + }, + { + name: '待审核', + type: 5, + count: 0, + }, + { + name: '已审核', + type: 5, + count: 0, + }, + { + name: '驳回', + type: 5, + count: 0, + } + ]; + constructor(public service: SupplyManagementService, private modal: NzModalService) { } + + /** + * 查询参数 + */ + get reqParams() { + return { + ...this.sf?.value, + }; + } + get selectedRows() { + return this.st?.list.filter((item) => item.checked) || []; + } + ngOnInit(): void { + this.initSF(); + this.initST(); + } + + + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + no: { + type: 'string', + title: '公司名称', + }, + no2: { + type: 'string', + title: '姓名' + }, + no1: { + type: 'string', + title: '手机号' + }, + }, + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { + title: '公司名称', + width: '100px', + className: 'text-center', + render: 'goodsId' + }, + { + title: '姓名', + width: '100px', + className: 'text-center', + }, + { title: '身份证号', index: 'externalSn', width: '120px', className: 'text-center' }, + { title: '手机号', index: 'linkUrl', width: '120px', className: 'text-center' }, + { + title: '身份证', + className: 'text-center', + width: '120px', + }, + { + title: '驾驶证', + className: 'text-center', + width: '120px', + }, + { + title: '从业资格证', + className: 'text-center', + width: '120px', + }, + { + title: '平台认证状态', + className: 'text-center', + width: '120px', + }, + { + title: '银行卡', + className: 'text-center', + width: '120px', + }, + { + title: '审核状态', + className: 'text-center', + width: '120px', + }, + { + title: '驳回原因', + className: 'text-center', + width: '120px', + render: 'feiong' + }, + { + title: '添加时间', + className: 'text-center', + width: '120px', + }, + { + title: '添加人', + className: 'text-center', + width: '120px', + render: 'enStatusStr27878' + }, + { + title: '操作', + fixed: 'right', + width: '200px', + className: 'text-left', + buttons: [ + { + text: '审核', + click: (_record) => this.viewEvaluate(_record), + }, + { + text: '查看详情', + click: (_record) => this.viewEvaluate(_record), + }, + ], + }, + ]; + } + + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + tabChange(item: any) { + console.log(item) + } + /** + * 重置表单 + */ + resetSF(): void { + this.sf.reset(); + this._$expand = false; + } + + + + // 获取录单员 + getCatalogueMember() { + const params = { + }; + return this.service.request(this.service.$api_get_catalogue_member, params, 'GET').pipe( + map((res) => { + if (res) { + console.log(res) + } + }), + ); + } + + selectChange(e: number) { + console.log(e); + } + /** + * 导入货源 + */ + importGoodsSource() { + + } + audit(item: any) { + console.log(item) + } + + /* + * 审核关闭弹窗 + view: 1 + 浮动费用: 0 + 查看评价: 3 + */ + handleCancel(type: string) { + console.log(type) + if(type === '0') { + this.isVisible = false + } else if(type === '1') { + console.log(type) + this.isVisibleView = false + } else if(type === '2') { + console.log(type) + } + } + /** + * 审核通过按钮 + */ + handleOK() { + + } + OpenPrice() { + this.isVisible = true + } + /** + * 浮动费用查看 + */ + FloatView(item: any) { + console.log(item) + this.isVisibleView = true + } + /** + *查看评价 + */ + viewEvaluate(item: any) { + console.log(item) + this.isVisibleView = true + } +} diff --git a/src/app/routes/order-management/order-management-routing.module.ts b/src/app/routes/order-management/order-management-routing.module.ts index 87e4e5f0..0872de19 100644 --- a/src/app/routes/order-management/order-management-routing.module.ts +++ b/src/app/routes/order-management/order-management-routing.module.ts @@ -1,7 +1,7 @@ /* * @Author: your name * @Date: 2021-12-03 15:31:52 - * @LastEditTime: 2021-12-06 20:21:41 + * @LastEditTime: 2021-12-07 09:59:57 * @LastEditors: Please set LastEditors * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: \tms-obc-web\src\app\routes\order-management\order-management-routing.module.ts @@ -10,6 +10,7 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { OrderManagementBulkeDetailComponent } from './components/bulk-detail/bulk-detail.component'; import { OrderManagementBulkComponent } from './components/bulk/bulk.component'; +import { OrderManagementDriverManageComponent } from './components/driver-manage/driver-manage.component'; import { OrderManagementVehicleDetailComponent } from './components/vehicle-detail/vehicle-detail.component'; import { OrderManagementVehicleComponent } from './components/vehicle/vehicle.component'; @@ -18,6 +19,7 @@ const routes: Routes = [ { path: 'vehicle-detail/:id', component: OrderManagementVehicleDetailComponent }, { path: 'bulk', component: OrderManagementBulkComponent }, { path: 'bulk-detail/:id', component: OrderManagementBulkeDetailComponent }, + { path: 'driver-manage', component: OrderManagementDriverManageComponent }, ] @NgModule({ imports: [RouterModule.forChild(routes)], diff --git a/src/app/routes/order-management/order-management.module.ts b/src/app/routes/order-management/order-management.module.ts index d64cc239..be0aa3db 100644 --- a/src/app/routes/order-management/order-management.module.ts +++ b/src/app/routes/order-management/order-management.module.ts @@ -2,6 +2,7 @@ import { NgModule, Type } from '@angular/core'; import { SharedModule } from '@shared'; import { OrderManagementBulkeDetailComponent } from './components/bulk-detail/bulk-detail.component'; import { OrderManagementBulkComponent } from './components/bulk/bulk.component'; +import { OrderManagementDriverManageComponent } from './components/driver-manage/driver-manage.component'; import { OrderManagementVehicleDetailComponent } from './components/vehicle-detail/vehicle-detail.component'; import { OrderManagementVehicleComponent } from './components/vehicle/vehicle.component'; @@ -11,7 +12,8 @@ const COMPONENTS: Type[] = [ OrderManagementVehicleComponent, OrderManagementVehicleDetailComponent, OrderManagementBulkComponent, - OrderManagementBulkeDetailComponent + OrderManagementBulkeDetailComponent, + OrderManagementDriverManageComponent ]; @NgModule({ diff --git a/src/assets/mocks/menu-data.json b/src/assets/mocks/menu-data.json index 7fbdce04..e53590c3 100644 --- a/src/assets/mocks/menu-data.json +++ b/src/assets/mocks/menu-data.json @@ -183,6 +183,16 @@ "icon": "anticon anticon-dashboard", "link": "/order-management/bulk" }, + { + "text": "结算单", + "children": [ + { + "text": "司机管理", + "icon": "anticon anticon-dashboard", + "link": "/order-management/driver-manage" + } + ] + }, { "text": "整车订单详情", "icon": "anticon anticon-dashboard", From 2af0eedb2d54c93cf27a2de335646b6f2b8bc834 Mon Sep 17 00:00:00 2001 From: wangshiming Date: Tue, 7 Dec 2021 10:48:27 +0800 Subject: [PATCH 0037/1600] =?UTF-8?q?=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../driver-manage.component.html | 9 ++++--- .../driver-manage/driver-manage.component.ts | 26 ++++++++----------- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/app/routes/order-management/components/driver-manage/driver-manage.component.html b/src/app/routes/order-management/components/driver-manage/driver-manage.component.html index 4a058561..1d1547c6 100644 --- a/src/app/routes/order-management/components/driver-manage/driver-manage.component.html +++ b/src/app/routes/order-management/components/driver-manage/driver-manage.component.html @@ -1,7 +1,7 @@ + +
    diff --git a/src/app/routes/order-management/components/car-manage/car-manage.component.html b/src/app/routes/order-management/components/car-manage/car-manage.component.html new file mode 100644 index 00000000..0eff15ed --- /dev/null +++ b/src/app/routes/order-management/components/car-manage/car-manage.component.html @@ -0,0 +1,115 @@ + + + + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + + + + + +
    + + + + {{item.no}} + + +
    +
    + + + + + + {{ infoData1?.enterpriseName }} + {{ infoData1?.unifiedSocialCreditCode }} + {{ infoData1?.enterpriseType }} + {{ infoData1?.registrationCapital }} 万元 + {{ infoData1?.enterpriseRegistrationTime }} + + {{ infoData1?.enterpriseRegistrationTime }} + + + + + {{ infoData1?.enterpriseAddress }} + + + + {{ infoData1?.businessScope }} + + + + {{ infoData1?.businessScope }} + 已临期 + + + + + + + + + + + + + + + + + + + + diff --git a/src/app/routes/order-management/components/car-manage/car-manage.component.less b/src/app/routes/order-management/components/car-manage/car-manage.component.less new file mode 100644 index 00000000..30444d6b --- /dev/null +++ b/src/app/routes/order-management/components/car-manage/car-manage.component.less @@ -0,0 +1,7 @@ + .left_btn { + width: 50px; + height: 32px; + padding-left: 8px; + line-height:32px; + background-color: #d7d7d7; + } \ No newline at end of file diff --git a/src/app/routes/order-management/components/car-manage/car-manage.component.spec.ts b/src/app/routes/order-management/components/car-manage/car-manage.component.spec.ts new file mode 100644 index 00000000..2d81888c --- /dev/null +++ b/src/app/routes/order-management/components/car-manage/car-manage.component.spec.ts @@ -0,0 +1,40 @@ +/* + * @Author: your name + * @Date: 2021-12-06 20:03:28 + * @LastEditTime: 2021-12-07 11:08:28 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\order-management\components\bulk\bulk.component.spec.ts + */ +/* + * @Author: your name + * @Date: 2021-12-06 19:39:49 + * @LastEditTime: 2021-12-06 19:41:08 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\order-management\components\bulk\bulk.component.spec.ts + */ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { OrderManagementCarManageComponent } from './car-manage.component'; + +describe('OrderManagementCarManageComponent', () => { + let component: OrderManagementCarManageComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ OrderManagementCarManageComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderManagementCarManageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/order-management/components/car-manage/car-manage.component.ts b/src/app/routes/order-management/components/car-manage/car-manage.component.ts new file mode 100644 index 00000000..596c5d3c --- /dev/null +++ b/src/app/routes/order-management/components/car-manage/car-manage.component.ts @@ -0,0 +1,299 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { SupplyManagementService } from '../../services/order-management.service'; + + +@Component({ + selector: 'app-supply-management-car-manage', + templateUrl: './car-manage.component.html', + styleUrls: ['./car-manage.component.less'] +}) +export class OrderManagementCarManageComponent implements OnInit { + url = `/user?_allow_anonymous=true`; + ui: SFUISchema = {}; + uiView: SFUISchema = {}; + schema: SFSchema = {}; + schemaView: SFSchema = {}; + auditMany = false; + auditstatus = false; + isVisibleView = false; + isVisibleRE = false; + _$expand = false; + infoData1: any; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfView', { static: false }) sfView!: SFComponent; + columns: STColumn[] = []; + demoValue: any; + datass: any = [ + { + one: '1', + two: '1', + three: '1', + id: 1 + }, + { + one: '2', + two: '2', + three: '2', + id: 2 + }, +]; + tabs = [ { + name: '全部', + type: 5, + count: 0, + }, + { + name: '待审核', + type: 5, + count: 0, + }, + { + name: '已审核', + type: 5, + count: 0, + }, + { + name: '驳回', + type: 5, + count: 0, + } + ]; + constructor(public service: SupplyManagementService, private modal: NzModalService) { } + + /** + * 查询参数 + */ + get reqParams() { + return { + ...this.sf?.value, + }; + } + get selectedRows() { + return this.st?.list.filter((item) => item.checked) || []; + } + ngOnInit(): void { + this.initSF(); + this.initST(); + this.initSFReject(); + } + + + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + no: { + type: 'string', + title: '公司名称', + }, + no2: { + type: 'string', + title: '姓名' + }, + no1: { + type: 'string', + title: '手机号' + }, + }, + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + initSFReject() { + this.schemaView = { + properties: { + roleDescription: { + title: '驳回原因', + type: 'string', + maxLength: 50, + ui: { + placeholder: '请输入驳回原因,最多不超过50字', + widget: 'textarea', + autosize: { minRows: 2, maxRows: 6 } + }, + }, + }, + }; + this.uiView = { '*': { spanLabelFixed: 110, grid: { span: 12 } } }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { + title: '公司名称', + width: '100px', + className: 'text-center', + render: 'goodsId' + }, + { + title: '姓名', + width: '100px', + className: 'text-center', + }, + { title: '身份证号', index: 'externalSn', width: '120px', className: 'text-center' }, + { title: '手机号', index: 'linkUrl', width: '120px', className: 'text-center' }, + { + title: '身份证', + className: 'text-center', + width: '120px', + }, + { + title: '驾驶证', + className: 'text-center', + width: '120px', + }, + { + title: '从业资格证', + className: 'text-center', + width: '120px', + }, + { + title: '平台认证状态', + className: 'text-center', + width: '120px', + }, + { + title: '银行卡', + className: 'text-center', + width: '120px', + }, + { + title: '审核状态', + className: 'text-center', + width: '120px', + }, + { + title: '驳回原因', + className: 'text-center', + width: '120px', + render: 'feiong' + }, + { + title: '添加时间', + className: 'text-center', + width: '120px', + }, + { + title: '添加人', + className: 'text-center', + width: '120px', + render: 'enStatusStr27878' + }, + { + title: '操作', + fixed: 'right', + width: '200px', + className: 'text-left', + buttons: [ + { + text: '审核', + click: (_record) => this.viewAudit(_record), + }, + { + text: '查看详情', + click: (_record) => this.viewDetail(_record), + }, + ], + }, + ]; + } + + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + tabChange(item: any) { + console.log(item) + } + /** + * 重置表单 + */ + resetSF(): void { + this.sf.reset(); + this._$expand = false; + } + + + + // 获取录单员 + getCatalogueMember() { + const params = { + }; + return this.service.request(this.service.$api_get_catalogue_member, params, 'GET').pipe( + map((res) => { + if (res) { + console.log(res) + } + }), + ); + } + + selectChange(e: number) { + console.log(e); + } + /** + * 导入货源 + */ + importGoodsSource() { + + } + audit(item: any) { + console.log(item) + } + + /* + * 审核关闭弹窗 + */ + handleCancel(item: string) { + if(item === '0') { + this.isVisibleView = false + } else{ + this.isVisibleRE = false + } + } + /** + * 审核通过按钮 + */ + handleOK() { + + } + /** + *查看评价 + */ + viewDetail(item: any) { + console.log(item) + this.auditstatus = true; + this.isVisibleView = true + } + viewAudit(item: any) { + console.log(item) + this.auditstatus = false; + this.isVisibleView = true + } + /** + *驳回 + */ + Reject() { + this.isVisibleRE = true; + } +} diff --git a/src/app/routes/order-management/components/driver-manage/driver-manage.component.html b/src/app/routes/order-management/components/driver-manage/driver-manage.component.html index 1d1547c6..d7abb76d 100644 --- a/src/app/routes/order-management/components/driver-manage/driver-manage.component.html +++ b/src/app/routes/order-management/components/driver-manage/driver-manage.component.html @@ -1,12 +1,14 @@ + +
    @@ -54,7 +56,7 @@ - + {{ infoData1?.enterpriseName }} @@ -93,9 +95,20 @@ - + - + + + + + + + + + + + + diff --git a/src/app/routes/order-management/components/driver-manage/driver-manage.component.ts b/src/app/routes/order-management/components/driver-manage/driver-manage.component.ts index 5e67f6b8..39f2b8ea 100644 --- a/src/app/routes/order-management/components/driver-manage/driver-manage.component.ts +++ b/src/app/routes/order-management/components/driver-manage/driver-manage.component.ts @@ -17,14 +17,16 @@ export class OrderManagementDriverManageComponent implements OnInit { ui: SFUISchema = {}; uiView: SFUISchema = {}; schema: SFSchema = {}; + schemaView: SFSchema = {}; auditMany = false; auditstatus = false; isVisibleView = false; - isVisible = false; + isVisibleRE = false; _$expand = false; infoData1: any; @ViewChild('st') private readonly st!: STComponent; @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfView', { static: false }) sfView!: SFComponent; columns: STColumn[] = []; demoValue: any; datass: any = [ @@ -78,6 +80,7 @@ export class OrderManagementDriverManageComponent implements OnInit { ngOnInit(): void { this.initSF(); this.initST(); + this.initSFReject(); } @@ -104,6 +107,23 @@ export class OrderManagementDriverManageComponent implements OnInit { }; this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; } + initSFReject() { + this.schemaView = { + properties: { + roleDescription: { + title: '驳回原因', + type: 'string', + maxLength: 50, + ui: { + placeholder: '请输入驳回原因,最多不超过50字', + widget: 'textarea', + autosize: { minRows: 2, maxRows: 6 } + }, + }, + }, + }; + this.uiView = { '*': { spanLabelFixed: 110, grid: { span: 12 } } }; + } /** * 初始化数据列表 @@ -244,24 +264,18 @@ export class OrderManagementDriverManageComponent implements OnInit { /* * 审核关闭弹窗 */ - handleCancel() { + handleCancel(item: string) { + if(item === '0') { this.isVisibleView = false + } else{ + this.isVisibleRE = false + } } /** * 审核通过按钮 */ handleOK() { - } - OpenPrice() { - this.isVisible = true - } - /** - * 浮动费用查看 - */ - FloatView(item: any) { - console.log(item) - this.isVisibleView = true } /** *查看评价 @@ -276,4 +290,10 @@ export class OrderManagementDriverManageComponent implements OnInit { this.auditstatus = false; this.isVisibleView = true } + /** + *驳回 + */ + Reject() { + this.isVisibleRE = true; + } } diff --git a/src/app/routes/order-management/components/vehicle/vehicle.component.html b/src/app/routes/order-management/components/vehicle/vehicle.component.html index 4d9b4ffe..c3fd33ee 100644 --- a/src/app/routes/order-management/components/vehicle/vehicle.component.html +++ b/src/app/routes/order-management/components/vehicle/vehicle.component.html @@ -1,12 +1,14 @@ + +
    diff --git a/src/app/routes/order-management/order-management-routing.module.ts b/src/app/routes/order-management/order-management-routing.module.ts index 0872de19..995f406d 100644 --- a/src/app/routes/order-management/order-management-routing.module.ts +++ b/src/app/routes/order-management/order-management-routing.module.ts @@ -10,6 +10,7 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { OrderManagementBulkeDetailComponent } from './components/bulk-detail/bulk-detail.component'; import { OrderManagementBulkComponent } from './components/bulk/bulk.component'; +import { OrderManagementCarManageComponent } from './components/car-manage/car-manage.component'; import { OrderManagementDriverManageComponent } from './components/driver-manage/driver-manage.component'; import { OrderManagementVehicleDetailComponent } from './components/vehicle-detail/vehicle-detail.component'; import { OrderManagementVehicleComponent } from './components/vehicle/vehicle.component'; @@ -20,6 +21,7 @@ const routes: Routes = [ { path: 'bulk', component: OrderManagementBulkComponent }, { path: 'bulk-detail/:id', component: OrderManagementBulkeDetailComponent }, { path: 'driver-manage', component: OrderManagementDriverManageComponent }, + { path: 'car-manage', component: OrderManagementCarManageComponent }, ] @NgModule({ imports: [RouterModule.forChild(routes)], diff --git a/src/app/routes/order-management/order-management.module.ts b/src/app/routes/order-management/order-management.module.ts index be0aa3db..faefe1db 100644 --- a/src/app/routes/order-management/order-management.module.ts +++ b/src/app/routes/order-management/order-management.module.ts @@ -2,6 +2,7 @@ import { NgModule, Type } from '@angular/core'; import { SharedModule } from '@shared'; import { OrderManagementBulkeDetailComponent } from './components/bulk-detail/bulk-detail.component'; import { OrderManagementBulkComponent } from './components/bulk/bulk.component'; +import { OrderManagementCarManageComponent } from './components/car-manage/car-manage.component'; import { OrderManagementDriverManageComponent } from './components/driver-manage/driver-manage.component'; import { OrderManagementVehicleDetailComponent } from './components/vehicle-detail/vehicle-detail.component'; @@ -13,7 +14,8 @@ const COMPONENTS: Type[] = [ OrderManagementVehicleDetailComponent, OrderManagementBulkComponent, OrderManagementBulkeDetailComponent, - OrderManagementDriverManageComponent + OrderManagementDriverManageComponent, + OrderManagementCarManageComponent ]; @NgModule({ diff --git a/src/assets/mocks/menu-data.json b/src/assets/mocks/menu-data.json index e53590c3..5350802c 100644 --- a/src/assets/mocks/menu-data.json +++ b/src/assets/mocks/menu-data.json @@ -190,6 +190,11 @@ "text": "司机管理", "icon": "anticon anticon-dashboard", "link": "/order-management/driver-manage" + }, + { + "text": "车辆管理", + "icon": "anticon anticon-dashboard", + "link": "/order-management/car-manage" } ] }, From 74f7526984cd1990ee99a99a0800dd3f88119664 Mon Sep 17 00:00:00 2001 From: wangshiming Date: Tue, 7 Dec 2021 11:23:51 +0800 Subject: [PATCH 0039/1600] =?UTF-8?q?=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../additionalc/additionalc.component.html | 103 +++++++ .../additionalc/additionalc.component.less | 7 + .../additionalc/additionalc.component.spec.ts | 40 +++ .../additionalc/additionalc.component.ts | 289 ++++++++++++++++++ .../car-manage/car-manage.component.html | 32 +- .../car-manage/car-manage.component.ts | 36 +-- .../order-management-routing.module.ts | 2 + .../order-management.module.ts | 4 +- src/assets/mocks/menu-data.json | 10 + 9 files changed, 477 insertions(+), 46 deletions(-) create mode 100644 src/app/routes/order-management/components/additionalc/additionalc.component.html create mode 100644 src/app/routes/order-management/components/additionalc/additionalc.component.less create mode 100644 src/app/routes/order-management/components/additionalc/additionalc.component.spec.ts create mode 100644 src/app/routes/order-management/components/additionalc/additionalc.component.ts diff --git a/src/app/routes/order-management/components/additionalc/additionalc.component.html b/src/app/routes/order-management/components/additionalc/additionalc.component.html new file mode 100644 index 00000000..3e81d6c0 --- /dev/null +++ b/src/app/routes/order-management/components/additionalc/additionalc.component.html @@ -0,0 +1,103 @@ + + + + + + +
    + +
    + +
    + + + +
    + +
    +
    + + + + +
    +
    +
    +
    + + + + + + +
    + + + + {{item.no}} + + +
    +
    + + + + + + {{ infoData1?.enterpriseName }} + {{ infoData1?.unifiedSocialCreditCode }} + {{ infoData1?.enterpriseType }} + {{ infoData1?.registrationCapital }} 万元 + {{ infoData1?.enterpriseRegistrationTime }} + + + + {{ infoData1?.enterpriseAddress }} + + + + {{ infoData1?.businessScope }} + + + + + + + + + + + + + + + + + + + + diff --git a/src/app/routes/order-management/components/additionalc/additionalc.component.less b/src/app/routes/order-management/components/additionalc/additionalc.component.less new file mode 100644 index 00000000..30444d6b --- /dev/null +++ b/src/app/routes/order-management/components/additionalc/additionalc.component.less @@ -0,0 +1,7 @@ + .left_btn { + width: 50px; + height: 32px; + padding-left: 8px; + line-height:32px; + background-color: #d7d7d7; + } \ No newline at end of file diff --git a/src/app/routes/order-management/components/additionalc/additionalc.component.spec.ts b/src/app/routes/order-management/components/additionalc/additionalc.component.spec.ts new file mode 100644 index 00000000..09643337 --- /dev/null +++ b/src/app/routes/order-management/components/additionalc/additionalc.component.spec.ts @@ -0,0 +1,40 @@ +/* + * @Author: your name + * @Date: 2021-12-06 20:03:28 + * @LastEditTime: 2021-12-07 11:21:42 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\order-management\components\bulk\bulk.component.spec.ts + */ +/* + * @Author: your name + * @Date: 2021-12-06 19:39:49 + * @LastEditTime: 2021-12-06 19:41:08 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\order-management\components\bulk\bulk.component.spec.ts + */ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { OrderManagementAdditionalcComponent } from './additionalc.component'; + +describe('OrderManagementAdditionalcComponent', () => { + let component: OrderManagementAdditionalcComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ OrderManagementAdditionalcComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OrderManagementAdditionalcComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/order-management/components/additionalc/additionalc.component.ts b/src/app/routes/order-management/components/additionalc/additionalc.component.ts new file mode 100644 index 00000000..1fdcb236 --- /dev/null +++ b/src/app/routes/order-management/components/additionalc/additionalc.component.ts @@ -0,0 +1,289 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STColumn, STComponent } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema, SFSelectWidgetSchema, SFUISchema } from '@delon/form'; +import { ModalHelper, _HttpClient } from '@delon/theme'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { map } from 'rxjs/operators'; +import { SupplyManagementService } from '../../services/order-management.service'; + + +@Component({ + selector: 'app-supply-management-additionalc', + templateUrl: './additionalc.component.html', + styleUrls: ['./additionalc.component.less'] +}) +export class OrderManagementAdditionalcComponent implements OnInit { + url = `/user?_allow_anonymous=true`; + ui: SFUISchema = {}; + uiView: SFUISchema = {}; + schema: SFSchema = {}; + schemaView: SFSchema = {}; + auditMany = false; + auditstatus = false; + isVisibleView = false; + isVisibleRE = false; + _$expand = false; + infoData1: any; + @ViewChild('st') private readonly st!: STComponent; + @ViewChild('sf', { static: false }) sf!: SFComponent; + @ViewChild('sfView', { static: false }) sfView!: SFComponent; + columns: STColumn[] = []; + demoValue: any; + datass: any = [ + { + one: '1', + two: '1', + three: '1', + id: 1 + }, + { + one: '2', + two: '2', + three: '2', + id: 2 + }, +]; + tabs = [ { + name: '全部', + type: 5, + count: 0, + }, + { + name: '待审核', + type: 5, + count: 0, + }, + { + name: '已审核', + type: 5, + count: 0, + }, + { + name: '驳回', + type: 5, + count: 0, + } + ]; + constructor(public service: SupplyManagementService, private modal: NzModalService) { } + + /** + * 查询参数 + */ + get reqParams() { + return { + ...this.sf?.value, + }; + } + get selectedRows() { + return this.st?.list.filter((item) => item.checked) || []; + } + ngOnInit(): void { + this.initSF(); + this.initST(); + this.initSFReject(); + } + + + + /** + * 初始化查询表单 + */ + initSF() { + this.schema = { + properties: { + no: { + type: 'string', + title: '公司名称', + }, + no2: { + type: 'string', + title: '车牌号' + }, + }, + }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 } } }; + } + initSFReject() { + this.schemaView = { + properties: { + roleDescription: { + title: '驳回原因', + type: 'string', + maxLength: 50, + ui: { + placeholder: '请输入驳回原因,最多不超过50字', + widget: 'textarea', + autosize: { minRows: 2, maxRows: 6 } + }, + }, + }, + }; + this.uiView = { '*': { spanLabelFixed: 110, grid: { span: 12 } } }; + } + + /** + * 初始化数据列表 + */ + initST() { + this.columns = [ + { + title: '公司名称', + width: '100px', + className: 'text-center', + render: 'goodsId' + }, + { + title: '车牌号', + width: '100px', + className: 'text-center', + }, + { title: '车型', index: 'externalSn', width: '120px', className: 'text-center' }, + { title: '车长(m)', index: 'linkUrl', width: '120px', className: 'text-center' }, + { + title: '载重(吨)', + className: 'text-center', + width: '120px', + }, + { + title: '行驶证', + className: 'text-center', + width: '120px', + }, + { + title: '道运证', + className: 'text-center', + width: '120px', + }, + { + title: '审核状态', + className: 'text-center', + width: '120px', + }, + { + title: '驳回原因', + className: 'text-center', + width: '120px', + }, + { + title: '添加时间', + className: 'text-center', + width: '120px', + }, + { + title: '驳回原因', + className: 'text-center', + width: '120px', + render: 'feiong' + }, + { + title: '添加人', + className: 'text-center', + width: '120px', + }, + { + title: '操作', + fixed: 'right', + width: '200px', + className: 'text-left', + buttons: [ + { + text: '审核', + click: (_record) => this.viewAudit(_record), + }, + { + text: '查看详情', + click: (_record) => this.viewDetail(_record), + }, + ], + }, + ]; + } + + /** + * 查询字段个数 + */ + get queryFieldCount(): number { + return Object.keys(this.schema?.properties || {}).length; + } + /** + * 伸缩查询条件 + */ + expandToggle(): void { + this._$expand = !this._$expand; + this.sf?.setValue('/_$expand', this._$expand); + } + tabChange(item: any) { + console.log(item) + } + /** + * 重置表单 + */ + resetSF(): void { + this.sf.reset(); + this._$expand = false; + } + + + + // 获取录单员 + getCatalogueMember() { + const params = { + }; + return this.service.request(this.service.$api_get_catalogue_member, params, 'GET').pipe( + map((res) => { + if (res) { + console.log(res) + } + }), + ); + } + + selectChange(e: number) { + console.log(e); + } + /** + * 导入货源 + */ + importGoodsSource() { + + } + audit(item: any) { + console.log(item) + } + + /* + * 审核关闭弹窗 + */ + handleCancel(item: string) { + if(item === '0') { + this.isVisibleView = false + } else{ + this.isVisibleRE = false + } + } + /** + * 审核通过按钮 + */ + handleOK() { + + } + /** + *查看评价 + */ + viewDetail(item: any) { + console.log(item) + this.auditstatus = true; + this.isVisibleView = true + } + viewAudit(item: any) { + console.log(item) + this.auditstatus = false; + this.isVisibleView = true + } + /** + *驳回 + */ + Reject() { + this.isVisibleRE = true; + } +} diff --git a/src/app/routes/order-management/components/car-manage/car-manage.component.html b/src/app/routes/order-management/components/car-manage/car-manage.component.html index 0eff15ed..3e81d6c0 100644 --- a/src/app/routes/order-management/components/car-manage/car-manage.component.html +++ b/src/app/routes/order-management/components/car-manage/car-manage.component.html @@ -1,7 +1,7 @@ - {{ infoData1?.enterpriseAddress }} - + {{ infoData1?.enterpriseAddress }} + - {{ infoData1?.businessScope }} - - - - {{ infoData1?.businessScope }} - 已临期 + {{ infoData1?.businessScope }} diff --git a/src/app/routes/order-management/components/car-manage/car-manage.component.ts b/src/app/routes/order-management/components/car-manage/car-manage.component.ts index 596c5d3c..99ce87a2 100644 --- a/src/app/routes/order-management/components/car-manage/car-manage.component.ts +++ b/src/app/routes/order-management/components/car-manage/car-manage.component.ts @@ -97,11 +97,7 @@ export class OrderManagementCarManageComponent implements OnInit { }, no2: { type: 'string', - title: '姓名' - }, - no1: { - type: 'string', - title: '手机号' + title: '车牌号' }, }, }; @@ -137,34 +133,24 @@ export class OrderManagementCarManageComponent implements OnInit { render: 'goodsId' }, { - title: '姓名', + title: '车牌号', width: '100px', className: 'text-center', }, - { title: '身份证号', index: 'externalSn', width: '120px', className: 'text-center' }, - { title: '手机号', index: 'linkUrl', width: '120px', className: 'text-center' }, + { title: '车型', index: 'externalSn', width: '120px', className: 'text-center' }, + { title: '车长(m)', index: 'linkUrl', width: '120px', className: 'text-center' }, { - title: '身份证', + title: '载重(吨)', className: 'text-center', width: '120px', }, { - title: '驾驶证', + title: '行驶证', className: 'text-center', width: '120px', }, { - title: '从业资格证', - className: 'text-center', - width: '120px', - }, - { - title: '平台认证状态', - className: 'text-center', - width: '120px', - }, - { - title: '银行卡', + title: '道运证', className: 'text-center', width: '120px', }, @@ -177,18 +163,22 @@ export class OrderManagementCarManageComponent implements OnInit { title: '驳回原因', className: 'text-center', width: '120px', - render: 'feiong' }, { title: '添加时间', className: 'text-center', width: '120px', }, + { + title: '驳回原因', + className: 'text-center', + width: '120px', + render: 'feiong' + }, { title: '添加人', className: 'text-center', width: '120px', - render: 'enStatusStr27878' }, { title: '操作', diff --git a/src/app/routes/order-management/order-management-routing.module.ts b/src/app/routes/order-management/order-management-routing.module.ts index 995f406d..28961a94 100644 --- a/src/app/routes/order-management/order-management-routing.module.ts +++ b/src/app/routes/order-management/order-management-routing.module.ts @@ -8,6 +8,7 @@ */ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; +import { OrderManagementAdditionalcComponent } from './components/additionalc/additionalc.component'; import { OrderManagementBulkeDetailComponent } from './components/bulk-detail/bulk-detail.component'; import { OrderManagementBulkComponent } from './components/bulk/bulk.component'; import { OrderManagementCarManageComponent } from './components/car-manage/car-manage.component'; @@ -22,6 +23,7 @@ const routes: Routes = [ { path: 'bulk-detail/:id', component: OrderManagementBulkeDetailComponent }, { path: 'driver-manage', component: OrderManagementDriverManageComponent }, { path: 'car-manage', component: OrderManagementCarManageComponent }, + { path: 'additionalc', component: OrderManagementAdditionalcComponent }, ] @NgModule({ imports: [RouterModule.forChild(routes)], diff --git a/src/app/routes/order-management/order-management.module.ts b/src/app/routes/order-management/order-management.module.ts index faefe1db..c437d7a0 100644 --- a/src/app/routes/order-management/order-management.module.ts +++ b/src/app/routes/order-management/order-management.module.ts @@ -1,5 +1,6 @@ import { NgModule, Type } from '@angular/core'; import { SharedModule } from '@shared'; +import { OrderManagementAdditionalcComponent } from './components/additionalc/additionalc.component'; import { OrderManagementBulkeDetailComponent } from './components/bulk-detail/bulk-detail.component'; import { OrderManagementBulkComponent } from './components/bulk/bulk.component'; import { OrderManagementCarManageComponent } from './components/car-manage/car-manage.component'; @@ -15,7 +16,8 @@ const COMPONENTS: Type[] = [ OrderManagementBulkComponent, OrderManagementBulkeDetailComponent, OrderManagementDriverManageComponent, - OrderManagementCarManageComponent + OrderManagementCarManageComponent, + OrderManagementAdditionalcComponent ]; @NgModule({ diff --git a/src/assets/mocks/menu-data.json b/src/assets/mocks/menu-data.json index 5350802c..dd98cd3e 100644 --- a/src/assets/mocks/menu-data.json +++ b/src/assets/mocks/menu-data.json @@ -198,6 +198,16 @@ } ] }, + { + "text": "补录单", + "children": [ + { + "text": "补录运单", + "icon": "anticon anticon-dashboard", + "link": "/order-management/additionalc" + } + ] + }, { "text": "整车订单详情", "icon": "anticon anticon-dashboard", From 0ab4631163651c5a3263cc8af5c9e45879175861 Mon Sep 17 00:00:00 2001 From: wangshiming Date: Tue, 7 Dec 2021 13:24:09 +0800 Subject: [PATCH 0040/1600] =?UTF-8?q?=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../car-manage/car-manage.component.ts | 73 +++++++++--------- src/assets/images/user/logo.png | Bin 2504 -> 44712 bytes src/favicon.ico | Bin 15678 -> 4286 bytes src/index.html | 6 +- 4 files changed, 41 insertions(+), 38 deletions(-) diff --git a/src/app/routes/order-management/components/car-manage/car-manage.component.ts b/src/app/routes/order-management/components/car-manage/car-manage.component.ts index 99ce87a2..565e151b 100644 --- a/src/app/routes/order-management/components/car-manage/car-manage.component.ts +++ b/src/app/routes/order-management/components/car-manage/car-manage.component.ts @@ -49,17 +49,27 @@ export class OrderManagementCarManageComponent implements OnInit { count: 0, }, { - name: '待审核', + name: '检测中', type: 5, count: 0, }, { - name: '已审核', + name: '不合格', type: 5, count: 0, }, { - name: '驳回', + name: '合格', + type: 5, + count: 0, + }, + { + name: '申诉中', + type: 5, + count: 0, + }, + { + name: '已取消', type: 5, count: 0, } @@ -93,9 +103,13 @@ export class OrderManagementCarManageComponent implements OnInit { properties: { no: { type: 'string', - title: '公司名称', + title: '运单号', }, no2: { + type: 'string', + title: '托运公司' + }, + no3: { type: 'string', title: '车牌号' }, @@ -127,56 +141,61 @@ export class OrderManagementCarManageComponent implements OnInit { initST() { this.columns = [ { - title: '公司名称', + title: '运单号', width: '100px', className: 'text-center', render: 'goodsId' }, { - title: '车牌号', + title: '检测状态', width: '100px', className: 'text-center', }, - { title: '车型', index: 'externalSn', width: '120px', className: 'text-center' }, - { title: '车长(m)', index: 'linkUrl', width: '120px', className: 'text-center' }, + { title: '异常原因', index: 'externalSn', width: '120px', className: 'text-center' }, + { title: '驳回原因', index: 'linkUrl', width: '120px', className: 'text-center' }, { - title: '载重(吨)', + title: '托运公司', className: 'text-center', width: '120px', }, { - title: '行驶证', + title: '发货省/市/区', className: 'text-center', width: '120px', }, { - title: '道运证', + title: '收货省/市/区', className: 'text-center', width: '120px', }, { - title: '审核状态', + title: '运单费用', className: 'text-center', width: '120px', }, { - title: '驳回原因', + title: '司机手机号', className: 'text-center', width: '120px', }, { - title: '添加时间', + title: '车牌号', className: 'text-center', width: '120px', }, { - title: '驳回原因', + title: '交易时间', className: 'text-center', width: '120px', render: 'feiong' }, { - title: '添加人', + title: '创建时间', + className: 'text-center', + width: '120px', + }, + { + title: '创建人', className: 'text-center', width: '120px', }, @@ -190,10 +209,6 @@ export class OrderManagementCarManageComponent implements OnInit { text: '审核', click: (_record) => this.viewAudit(_record), }, - { - text: '查看详情', - click: (_record) => this.viewDetail(_record), - }, ], }, ]; @@ -266,24 +281,12 @@ export class OrderManagementCarManageComponent implements OnInit { */ handleOK() { - } - /** - *查看评价 - */ - viewDetail(item: any) { - console.log(item) - this.auditstatus = true; - this.isVisibleView = true } viewAudit(item: any) { console.log(item) - this.auditstatus = false; - this.isVisibleView = true - } - /** - *驳回 - */ - Reject() { this.isVisibleRE = true; } + Reject() { + + } } diff --git a/src/assets/images/user/logo.png b/src/assets/images/user/logo.png index e2d680a3425d17bdb1ef9a7d281fd71b4b4b0def..dc2042283aa4f8b8d0187c2e75e3cf69a4827f43 100644 GIT binary patch literal 44712 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 z zj9~B|q9(J*Bm-%zdiXQ5Y2gK-0XVfzh^;tncfFXj(`N={07-*wT-eSAjSjT~l|)Jk zJTws0ceqzq>zn~=Pi!)yzLO{<56fYIwOsMBzLELZdFw> zPf3G%1-!EqwURRfu{4YiP!*vb9>L8XQIBog0EjQUGflaz|hQ4g!5n;upIWUdnWwTnaKO##a(gDdy5FpJ@-V z3wD5?Uy|HQu!55N!x;cfx@kvAj8)dtnC950mXs)I6eEzyl=%>7L|G=JevxSVSf6PR z>j8X3B5~t?h%=tg-Ycn*8)`y4noJBa@@!2l#OP1(@mVD`UXP*ozCdEN?NzGofj5#E z_KST&;+MiP%$c5=$g8T95(&1Yw}olye`aaZebXqj z4-d2%oWB5jLzL9U0Qk1CH=z~D@&eji!Q(mX7yFFFEai{+T(+9UubN;fw~$R&^6%|L zt{;xN-cDdBtBA{BE&cu&{eMfvzpL%!oAlp<5ph+gWz_|%1VvHu{=P&5;Ecood|ILb z_z5!S_{syQ;>}|41*Xog3yHg6G%czDL7y*%zcokn!VBOOHAY=UFYU4`!u5&H(I7dTuEz1Bb;FpDI4Ev>K(fFV&$RflYWNWj^0E}(}X;ez$rM>GV zZldd96Yb#foP%1kaT)+b?ftvNvxW(Nw!zK~`=t=^-lF|DewXkY>gsK8M6WK1%uBE64|VgHjNEh*0#Qs!CWgfLGq1q_1#9RN-T}$ z@DI8Ehk`y;hsiSh%y(csxxQ1)Z;ZnOI7%X<7#fjr_ zP2hP<_O^!%Oa|aciLuFxq8C6JfbGZr9U7Hua%Av%S2lh_M@J?EcOn`hgC9e@2v!C(yU>AZ;X)#3UjF*kv&tpn$s zt`=-0p`0bP-v-C~Ps1}7bSFm?0!$|c9$A|xfiFeLHjJ`a9vs1T-#1-%y#!WWWFztk_kiYkM_< z1_1T4flQ($P=wg|8jlbxSn~UPI<9R$l{{b-ZHpovDzJPFvyx{ z`?Yuz$G;-XLAQdE$JAgnOYf~Eff{P^HHh1}!G2K_lGjCW6 zGynq@pBlTe0hnmN={w0OXaGEg@Vq?(aHhl_fcsp>*lEPww%$;wNftKXKSAfJMBwYz zp)*a1KaSM=QUe%(0_Vqro2H~to`=Z+a1Yy-xGp~iqdaBAo*5Z{cS!^WSwTRRYIlTd zKv{M0il$1Q86U6y%(so1eC}K|cfCRKsaEEuIA-IQB(BMIfs$n@JA=`&uW{P#(@k1xV7;Wjx2*-~#z&b|ytT7!SPw!XhR z8uA^%YtB2*S|x6lUwW3YV>36Agt0#?*ntvV#9E`!96>Z#>hup8fKv&hPsSQN=sWt( z{%8!qrtZ%0i=HI$i~fT^5}PzToDfFWX>F10dDU9K28W-|q4#YIi>^tekSm9GNtu`p zfn!V_$c>^Rv%brzM4c(f!vzpAV^g~Ry#3n1S}zfVcp^llWy9;z3yFq?^a}xAjVvm|G>+>Sc}=-y7z5R`)Dw z<^-P1FnEnTe1gW;dcrm-U|4g1(oM zylW+X?!%s~?dLTqlsFms_eu=&aF*x5G3C|zFD~QHYchKQe8-sD3DO%B0t;7vUm_dEhK#U8uy6ZjpLNJOXM z9!N2pm=rh~YZeqJPN60SyktV{ecKgf$8i||1nO8NF=_FxxO)IzmoC_0%qxM zlH+flg~y4@HMYsW$BJZ<`5BEBoN^vwlf>`yBk=U5qqpa$+M2=uxMIZqS5o2ju>-Sn z(OADU_NH_2g1aSsVRS1oX4%2H*gm=aTboJ-TGZ{-rlwcm{K` zoXYqMGN;E1%X92s1Ago_!DHV!n`6RJ%X1*J7aw$n=*55ILF?~K@^M|z9qHdKNeuZG z@?3z`6b9hGDbFS2-L4up(C(mqQTWAE5;w)|5T{NFVwN1j4K8vj+Rl=D!TB^EU&rjW z->GYr%Yw&BWQG=F;FkU-3{6~9kGlc*xWtk==I!$C|A(vUroh+9( z;DZul!>2q)-`{iMV*sfBi@G=HUnL$c#1)vwJ&zH*&%iV)dFx(~_&qT$K1?K?;|CyG zTDUMI1L>6bPJie-`Xs+f2H6aSk_BsVBs3r1=p?~jNXX2A28fp^u#4Z!sh-{&<2E6GZ|7gWUn$b>Oo$LXbF zVgLlS7uUB+q=PQedL200S@42Q*aX;-DX;${WUzgoFjnyz2gj~Y&`C6bDeHY^@Lj&L z47Bgg18RhWH-?#Xd#!mcoCd0))T4D%Q z;v3D<=kSK3F~D&PfKpzYpCfV8h7@t1!td>;jJO$qeI?SnqZfTlRSW>SgHJExD8bjt z92VKK_@b@WtQ%(0GadZ)=i|+C3083N&w$Tmg-bif_T8N%8_c$cBqg%hiGJfc`p%fN zbYqebtjMGFNerjnUKIntM;Jwo*p#>lZbetHk+I~xY$~K!J3-_Lt+i{{zk?H za2+jd`JD|ve96*8<9V z3jED)Nqi10mDX< z{q1thd=MpKWG(oUV)DyidAs^C zvp4iyhtOxqdM@-hkH%zHzunQ827qHPa!ieTB)+$E1uc6u4S=Ohl{_k%X(ae)j;_OL z)eUsLE|nZFr-SYkU+@95Ht0HT)?h)3dp2pw?abfv9BrCt5jGmt0PF$J@wmh?Fjk(} zD&vAGEk69QwV70lWC*Kk`f|w@w?PcRpreNn-$zO$e&F=au)+4+)~tUu4M0V1;{l1! zhb7b#`SWEG4QK$$ZQw6SdS5RS?m+dzraaGT^9RXFT=-jjhmWR4-}QGyrNlRNjP<@D zx#{PuGR&9^b;>0znax4J1n+7#Z>-W5Hq7D29)^l(T3Kb(X9W356$h#cLm2W4B;o?x z?{S2h=(~NcU2gh0PBOXYOVl>q2HGx3+vqc2lK7k(cu6&zWSfrIuVDA8DNlCxTNxHW$Q5Lx?-?Qp zh~L%9BqxQx?wQ&|4A*L50QQxLYKor5hobBO5S%swSnLkJ-=_|#ta2xKTxqQ#41i~H z{zaL?U`zQNMYY+r$N=mru@~S~;w6mk;yOkMrr9o;+_RbW3NP6)0bA7lWU>(|0ElmJ zm&DL)G4GyCo7K*AYpByCqnadnIU|CL8)On;i|qb__F5fI*)7je&kt2xn*Wqo6*@_H zrmfX|n1M_iTg#DSr6R_D9$9qV@Ja7(!kR5>Oe}@LWmo=LCbN}-3S|ichmQk z@m^MjIFPk`pbI3ng5K@f#>^=70u<~dl6$a%!$BUuq7Gx-^mZ5a26jIdI<+VpfKN!o z0l-jWk6Igm<0UpVJQ6irfDPuN@b>?pWO7fXTY)}9*s|goxhNZeizN0;{3fJ;tK|b7 zDY4rPr@`J56$2nfEOl&)p3dp5)gi36-tRj49vsHpG@@q!L=%wA9MSjvY>jUlad-EV)32s6a<->nW`Wc2Yc@l`ORl?$Nxkeem;0O&OZ(eblLaLMuE zekJ>%@^wrE;;cV!_;JcH-6nPLBBjgybh-r(+(6EVkOAQP<$DszKu)gdWyyzLaymjo zeN$%VS70Z=0Mw5zDj1^odJ|1ssY4eneUS)FSs_Bag0yF3VF6<6{QGNc01W1v9kLS} z-}SBJq9~6KXxjIeXDILKOjOz#*^r++l$N(&ov}c~9rlT4j23`X%yTP&+ z_P22OXVlLC7-8A(FoG*rhb@|lm8p;5S{1BBlnlVpk{W@2=UMuWu2n+=@UPZW!iV}a zfi%eK1=zhFi9ozbe8j@b8W{FmqYhc*^(Wu~@H)63flxps0S#Gzpj`-<;^~WOdmt*T znk-y^6*YHlwjp^4cgW*;4{;T!Ll$ivBwPlDrNMejU~0_G^8K^8#t`u<39EyxowvUf zx8^{JJ@EOk7eHog$D4kH1;+`<@2kVrFnXU49wXuh4rJ4HH2{7YO3%Rd+&|QIXf83) z1Fxs%&+HA=!XJ`|2lqMr+?O+L(iX3;tDO1&B&e?rR>SCK4#8z5*!pg(?p{DK-9eWL z-$%9Rpv9`xfk+6`XG!2u6o*2?R@h%lT+~)f?gWx7`i8D-c>B+m*z=&Yig_d7;W!O- z=aulSvKN5JK*$eRO|D36l|LbXn}2O8!|^Gl7y#GOCwYR1Qr3blD^e$(3|W=FAk6%q zD>2!rw7S~6G1u0DZg`>2MnG^jU>7Y1)amuALlcg`D5v|&a`1PPtk0ChqKq#y5U%lZ ziHrGdFPof*jYx80fBt-X3epXAm>N`{3ln2Orv4QHmp7AXSXG)zNx>J!@ofLVn}4OA z5uU0e5fsI3O@{}hU1C!V_5w`xB~U{N3M>xymGR_KUznPWfGH+BooJm z>nWJPriv2#_ccpHw&m}QvYNJv%Fzc3EJ}k(XU@v^CPD-7xhlsq!&^K{-?i3@SVt1f zCkST&vF?tFslJPz@o|aowGZ@|DB%bCrY0DJ#bDhuSG4b5Mpc3rY05O@T^J-+|9(XK z#Zi3UZ0DYE>B_6v`cAv99Zpyq_arUkv%D9ehFwm`<1T2h`K-egl1Ew%Z-{*9}{I!X>aKBe)GhkKl#w95yat!WlUPkE33OQ-r}pZVY|4Z;|J1!37M@ zQCFZ`Z-@eWr9=$4ch}O2yX8&FZ>p6NH|U>;J+>j)Z%3XDPjUn6i)X!G;`_xRng78S z*-cARk$NWqVoNx}@cY}n0Pz2h2sx@Z#1bp37hn@%tJTf`;9{8iWXY3`7($(eAR~oN zoyA$!_O`Ksv`)z|PAjX0JE@R^c`@(47Hl!gwCCb6!2rx?sJ zYGnWp@#Jyduf}l0k3g$xJ*2QCOBaZCG}X3c0nC0F*ZQ98FI9)QN{8luJb9#;e|Bws z_gXYQ(6f9{qD%UD&*_-Jb16+2lLpDfd|tnpOJINe)e`eaoNU%N66yd~>Cn7SB0M(s z0=(I)odNi`q-Q}?p~LXzUzcm%jpz^IEMo2ZDM@?iES?B7RUV*PhvqN>?2y$9Ft3IN z;1~%W0Nz4b*EpZ|Z?A|ry>+dnKdrIB9-d2bB!rUKe1v=stUtLx9pG^v8qw9YCqZ_} zqJlcHRtCTo#%y(spW$!tIs3%D>1V{rkF3IQteWpmnm<;57h|5xyYv{!DtpTDLzrDWJn61 z>I_+zPO4EN79rg}#<2ksD)g$32Vj-^x|0$Oz)yY4*r66vfxIs5Z~)L+P&xe&Hu#Q& zrldB{>n{_d+={(Jjkxq~h6`&tURr*WCtj;2uV`h+>{BI{gTY)y|DP778e6hlCeQwA~#md_<4k$cH^rXUP# zXKr}mSUL;AOJCH_jU2`KNUZkTB(~7L4EoMmC34(M2QP01CIoGIW^)646X9!J3I0BV?pm7Lx_Vl?N9p_rxar<^E|ru zkGEmqWLn_&Pl5h*4CP{6vtw3XxQx~F{SV}HRtRr+iy!RCG?4U3nxk1p=u=&w=TT?v zu0eM@&q)<*)MT_5i)OojFR`Ed9KqIGJB|R)G`O{<9LF32K)ruEq0V{&NWsP2ufP#- zw5A;P8Fx6~7y_d~+?e}f_aq_V4sM4Q?9ZSHFyM29As2t69#YIAGm&1|FLMG-KR&$; zFqAD6_TV%0V3+L!xi6QIs(dGchJeQ}mX2ecKayApaAa6@qy_I!FCt8LqzKn`73{OR zg`>%!KL@>oXu}Ze{WG3z?6o?}>C;(h*%@r}k_**o9;*?^YHa;-@%}dmO8U8k3e`mi z3E%(iI93hXO*#y_(@L^M6fhS^LKh?2WvyS-IO0d*i zuq$I{bc^+g1@ZnTRN5_!#F;d#PILraaNQtoVm^CfVc(=dT)tVUZDTt z_VC49a(e;vNxtMU+EOCH=9aFf(7<>D+HEm$Aq$eN>crN}BWs74x|Mehx?*;t;?Nsx z!;&og|Czde$4%WAF{J4lG!rcps#XhL4%_YDf}9m@x5@h^A|VwV0cTUMyBriV;2|3@CD2YVEGATF@ijLMorM+50$?=iqhn93j$^c+@ z-oGW{0vxLhfRf1E{@HRH^INFQSIhnXwL;dIScnMAQOFUnGjW^AFaSu{d4@6oN+M$b zOg*duB_tplJ?mmsAS(Ocw-YR|6Ihb@iNs2PRV$7FB}ztr338}&sl9mWDjj2AkV7|h7Qz9$oPqneqp?ir@ zct@K;v-=w*?)xnvKSpFG1939X7vq^fm-r$I#OKEfro!1*BFEG9`N2;z8qB$zI#Xrd z{sDaU`y-YA!Y(Mci_hp^EBR&I2i^xC49c5``l==bl~h+Yb>~>Wsa1|2?;yZm^m`N17=&uu)7}-G1TMbyhJhC!TDTTES}w=$T*aY!jsil(Q4xfKG)=z z+M7X_f<9m8gCFWDGDaLKEpiDGFaQV;dTX6u(i22iwnqrv)xWfhZ9eBLwZoNc-Gl8+ zvC{mLXb&TjFo(L=Iiqki4t}UV^BkUoh~7(dQyqd|PcB#BaA1mmByx{g_`O_H6Qm!O znjlm{u0B?fke=KTxQ?D}%p!QZKh-J0x4qt%^SEbQC$!^X1qlo)h9cHP=E03$y#v2y*<+ZD96CK_B*QeIHJm5>lJ!?!PHlCX#@>`BobNyy2+NEyaD%VQSlQuGB&Qbr}C-<#S(Ry_YSLE6Gj4RI{5jgYsxJs{izMO7l= zNo_I!*r@PugkR|6pav!i153a;J$Ln)tQf`EO3CGCF1-C2B-7P(W<&@!uixAY|$b6=q zcN7-z=1{H04I!&~7qWqLx=a`5XSJy`EOvVx26n2YU-2Ax4o7dSeOR`>4xgC1x4~Ze z3eZd8<~XQm3F@OAV|q!r?y#yAn$me7ZrC zFulESSRjse5|gM$e@g={#4AL2a+(jZq)$x1ftg?mkhGpRzDBBto+dI=b=GkXrP^`- zd3{TC!r5rxSr#`WOtiE;;ODO!cv03-qVPE1AQkNBB9P@=KdyaPY%w)KcHnrlObW#$}2XM};w&Mw5A;ssV3$ zy%L4Xd`CaP>l8iZUMCJisnO%A$NC8L5|)-teF|Yt+$NEZUWN{0a}qr34n#5 zCnpP+RrH^i)VbcS1lbNY*x4#veWy&ei7e3nis8Y>{{CO^rZa&s%qtqr5z~PufCD)H z`BD!q@`;4t6Q{*3kgGb+*F{I6m+1gwpc;v`CViF#7ej(4iYZUD3+M%)f04*FDSINd z3yj>Zc<2MW!ApH(vi7C`H4tS&11ZIR6_YZ~YnwT2eHovLz$~_-u_yH}upp-?kAUC! zc;J&EsSFwb%_bTT4qA-i`fsLk<;h;w*im>nnrbBDw?I10 z)^@k^7$|RYbe0o{aA9-IHo+^DC_EJweuhV-Eld=a63t@>_-#*Z)kRZlAwt<3i0n0P z2OmA!e}FFXEqzy?o_%#X$F}q?P=~+l31oE+&Bc|+fqZV;h+%FZOcefU&3^xe&L3|xNpLs8vNkL{}iwVj&$pC_{1}_OBO_A@JOQ_M0$MoQ1liM|* zhxK<_+~BQ6@77Z8{>VK76QR2`5hvw3Dn~oL7;cy_QFvh960Y%j*erz@#E0d62wY1` z--+P1ABbsYAIFZriwQp8YNwjM)|g|wQIJ=bbi?LJ@XR?46HTSD;wZy5k2_Ha&p9WA zs$Sh`aNPQaI`mE}4`<4=`3`Sw{UlX+HpDcfy94*8Zy8esdoYeACt~N#)iHh)M!**h zA|Y|ZgE72GHq+=aPZYZJ%#8pLMyTtHT`3dNU!Ht|uW3Q3z6hkEC0aJu88`{su zpKk~KGU&@O&FnuyEZB2=%5AJ#=&*vR@FOL-mt)-xQ7$-%5N^8{^x2pu_?`ppfg6ASfS}?6J<0OjYWPe3=0l{R zT!KP_*e42Kppw~}U7C*TH^ALY8}&)j!scJG?9wukrt9dt(?sMWF+KR`$$SYtn~i!0 zf9?W2H>#343J#CBG=l4irkbhLNOWgR6Hbqk>$y91PfD*VyA z7A6YIFznU6@rfjb$Gh1iwranJ>fK&UGy6yjel|S!Z0=n;x~kfg&M(q*s z#w(|T$M`{pzq@@2Zu{w&9(+u&E`z;spqr&xg|0Tv|DYrWg11?r0!G>s-C8G7j2Fj5 zp{P+i#_k?<<6&#{_Q*_-WFx;U5ytqa2)Df$^r0ByG?Zxi@Osd91c`JDZ@RJ+sB3Jc z4;FVbxA1)05X)DXC_ESR&oNFEp6v0_W1R!AU+%zkdq-_i@bZ z7YUT(gJ2{lh4~`aPAL4wrtt_Y;Su;lxN|1xQ!z!LxfS#nFaVP)v)NnGshk~IU>Xj_ zG_!vfM;x;B>3)rprb-$_@?Zq|O_ANs3-0*0!tY;*31`99+}#@~^w}E^0Q|)A7D90C zM=)GJXmBFU;lMW^ByVpgpKknh_9Bi&sHEAGh1gn4ZJln`2+Le?O%x7LN%UT7mb#C) z^w!5T!S^ID13UVjVJY*4Y*KabDcM@~TMy~W7&U)M#}}W- zURlzmHoB7Gj6jmgU`E*I9_K`1DW*LU2*-Y8!D!<>5k5y_RyV$qQ3&?CzuK;|5WTe` zQTT6l$ReHW{D^DolX=M(Cq^N>bJgKjGA@sxr$>w)r!h}p#5qyeh`Naoq)(=Vrf6MO znSCWS%MaMRAO2|2@6)uHI*9ej?Ef8fq3>wBgv25P-5nf}M~RZ^8v#VT$(F}pF_S!v zu@h;8qL`2ntocDsOh?6#-_S~JB#uB$-b z+UJH!)g~B(d4K&d&BQG)z#I3tuEa5w-NElcajtQita@vO6n@S ztvK7k`Yu__6HmUG#*KL>=;u|Uuqwc)KgafDSF|Z}K$5|%&Q>JVt*<1C9)Uys<++Zq zqwuDfLSoApWI7d$>dY{+uWo!L(f0@zE@b&mW5^KL$;w3GMs>Ki3%C7G&{j`yL-Iqv zQeVJ|*|geRN*YIS+R%3d?>#RcI+{up4zJIEcEiEnk0B*rq3>0rf-AeP8?rY2T!=lM;P*~c;D6MaXU79tKKLQ^55l6*><#UpSG zR>&s9diD++f8N%A8{~Yt#F-R05O!-oH zz5@z5(J{I95{IqpSfmzRiIS~(1pRheFz|HS`13HzkT)8|_FB;EKo9qbyfw(AnGf#1 z5+zE8^9Gz&UiA`Rn8U#D zSjZZjiAaeOB~|nYHl|YogTO+NOMNaJx;DbQmkmaOFkF8XnSFha5FlmH5S@HVlqjiz zloAQHwx^Ai<}Vdx!>q=9Tb~1m?{v_gN*F&b&`{I)aMSM@AUcwzvo*OK8!+41+TJ#` zNJ^AQ@d!+CvolyW#CTh0ful_Wqi_T#!Lao^i1BuP6>fTLRlXavhq@ML2p&Cf^})?A zm@2`iL`mHQZ{fg6@~%3MjDhQDNc;76(RHVPkywCU90Aei7AoOA0Qz0dFl_5bA)S_+ kD|an2Hz(lGl*C8=9}8}2(!m;}Z~y=R07*qoM6N<$f)mmoUH||9 diff --git a/src/index.html b/src/index.html index 543758d5..30d055bb 100644 --- a/src/index.html +++ b/src/index.html @@ -1,8 +1,8 @@ @@ -15,7 +15,7 @@ - + diff --git a/src/app/routes/vehicle/components/list/img-view/img-view.component.spec.ts b/src/app/routes/vehicle/components/list/img-view/img-view.component.spec.ts new file mode 100644 index 00000000..419a51ce --- /dev/null +++ b/src/app/routes/vehicle/components/list/img-view/img-view.component.spec.ts @@ -0,0 +1,23 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { SettingComponentsInfoImgViewComponent } from './img-view.component'; + +describe('SettingComponentsInfoImgViewComponent', () => { + let component: SettingComponentsInfoImgViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [SettingComponentsInfoImgViewComponent], + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SettingComponentsInfoImgViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/routes/vehicle/components/list/img-view/img-view.component.ts b/src/app/routes/vehicle/components/list/img-view/img-view.component.ts new file mode 100644 index 00000000..5019df4a --- /dev/null +++ b/src/app/routes/vehicle/components/list/img-view/img-view.component.ts @@ -0,0 +1,25 @@ +import { Component, OnInit } from '@angular/core'; +import { _HttpClient } from '@delon/theme'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; + +@Component({ + selector: 'app-setting-components-info-img-view', + templateUrl: './img-view.component.html', +}) +export class VehicleImgViewComponent implements OnInit { + record: any = {}; + i: any; + + constructor(private modal: NzModalRef, public msgSrv: NzMessageService, public http: _HttpClient) {} + + ngOnInit(): void { + console.log(this.i.imgUrl, 66666666666); + + // this.http.get(`/user/${this.record.id}`).subscribe(res => this.i = res); + } + + close() { + this.modal.destroy(); + } +} diff --git a/src/app/routes/vehicle/components/list/list.component.ts b/src/app/routes/vehicle/components/list/list.component.ts index cf8a5236..4ac469a4 100644 --- a/src/app/routes/vehicle/components/list/list.component.ts +++ b/src/app/routes/vehicle/components/list/list.component.ts @@ -155,7 +155,7 @@ export class VehicleComponentsListComponent implements OnInit { }, }, }; - this.ui = { '*': { spanLabelFixed: 90, grid: { span: 8, gutter: 4 }, enter: () => this.st.load() } }; + this.ui = { '*': { spanLabelFixed: 110, grid: { span: 8, gutter: 4 }, enter: () => this.st.load() } }; } initST() { @@ -164,7 +164,6 @@ export class VehicleComponentsListComponent implements OnInit { { title: '车牌号', className: 'text-center', index: 'storeName' }, { title: '车牌颜色', className: 'text-center', index: 'contactsName' }, { title: '车型-车长-载重', className: 'text-center', render: 'enterpriseName' }, - { title: '承运总单量', className: 'text-center', index: 'unifiedSocialCreditCode' }, { title: '运营状态', className: 'text-center', index: 'effectiveDateStr', type: 'badge', badge: { diff --git a/src/app/routes/vehicle/vehicle.module.ts b/src/app/routes/vehicle/vehicle.module.ts index 19165da6..82c45639 100644 --- a/src/app/routes/vehicle/vehicle.module.ts +++ b/src/app/routes/vehicle/vehicle.module.ts @@ -1,7 +1,7 @@ /* * @Author: your name * @Date: 2021-11-29 15:22:34 - * @LastEditTime: 2021-12-01 20:36:45 + * @LastEditTime: 2021-12-07 17:30:51 * @LastEditors: Please set LastEditors * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: \tms-obc-web\src\app\routes\usercenter\usercenter.module.ts @@ -9,13 +9,17 @@ import { NgModule } from '@angular/core'; import { SharedModule } from '@shared'; import { VehicleComponentsListDetailComponent } from './components/list/detail/detail.component'; +import { VehicleComponentsListEditComponent } from './components/list/edit/edit.component'; +import { VehicleImgViewComponent } from './components/list/img-view/img-view.component'; import { VehicleComponentsListComponent } from './components/list/list.component'; import { VehicleRoutingModule } from './vehicle-routing.module'; const COMPONENTS = [ VehicleComponentsListComponent, - VehicleComponentsListDetailComponent + VehicleComponentsListDetailComponent, + VehicleComponentsListEditComponent, + VehicleImgViewComponent ]; @NgModule({ diff --git a/src/assets/mocks/menu-data.json b/src/assets/mocks/menu-data.json index 406d064f..678570e2 100644 --- a/src/assets/mocks/menu-data.json +++ b/src/assets/mocks/menu-data.json @@ -270,12 +270,12 @@ ] }, { - "text": "车辆管理", + "text": "运力管理", "icon": "anticon anticon-dashboard", "group": true, "children": [ { - "text": "车辆列表", + "text": "车辆管理", "link": "/vehicle/list" }, { From b5262f5a26eb1fa20f4144435589fb6bd698a74b Mon Sep 17 00:00:00 2001 From: Taric Xin Date: Tue, 7 Dec 2021 19:39:28 +0800 Subject: [PATCH 0051/1600] edit --- proxy.conf.js | 8 +- src/app/core/core.module.ts | 3 +- src/app/core/guards/token.guard.ts | 40 +++ src/app/core/index.ts | 2 + src/app/core/startup/startup.service.ts | 8 +- .../driver-account-detail.component.html | 57 +++++ .../driver-account-detail.component.less | 28 +++ .../driver-account-detail.component.ts | 164 +++++++++++++ .../driver-account.component.html | 31 +++ .../driver-account.component.less | 29 +++ .../driver-account.component.ts | 112 +++++++++ .../freight-account-detail.component.html | 54 +++++ .../freight-account-detail.component.less | 28 +++ .../freight-account-detail.component.ts | 181 ++++++++++++++ .../freight-account.component.html | 46 ++++ .../freight-account.component.less | 29 +++ .../freight-account.component.ts | 148 ++++++++++++ .../main-account/main-account.component.html | 26 ++ .../main-account/main-account.component.less | 13 + .../main-account/main-account.component.ts | 89 +++++++ .../recharge-record.component.html | 49 ++++ .../recharge-record.component.less | 28 +++ .../recharge-record.component.ts | 157 ++++++++++++ .../withdrawals-record.component.html | 78 ++++++ .../withdrawals-record.component.less | 22 ++ .../withdrawals-record.component.ts | 227 ++++++++++++++++++ .../financial-managemen-routing.module.ts | 25 ++ .../financial-management.module.ts | 27 +++ src/app/routes/routes-routing.module.ts | 4 + .../shared/services/business/user.service.ts | 7 +- src/assets/mocks/menu-data.json | 48 +++- src/conf/sys.conf.ts | 2 +- 32 files changed, 1752 insertions(+), 18 deletions(-) create mode 100644 src/app/core/guards/token.guard.ts create mode 100644 src/app/routes/financial-management/components/driver-account/driver-account-detail/driver-account-detail.component.html create mode 100644 src/app/routes/financial-management/components/driver-account/driver-account-detail/driver-account-detail.component.less create mode 100644 src/app/routes/financial-management/components/driver-account/driver-account-detail/driver-account-detail.component.ts create mode 100644 src/app/routes/financial-management/components/driver-account/driver-account.component.html create mode 100644 src/app/routes/financial-management/components/driver-account/driver-account.component.less create mode 100644 src/app/routes/financial-management/components/driver-account/driver-account.component.ts create mode 100644 src/app/routes/financial-management/components/freight-account/freight-account-detail/freight-account-detail.component.html create mode 100644 src/app/routes/financial-management/components/freight-account/freight-account-detail/freight-account-detail.component.less create mode 100644 src/app/routes/financial-management/components/freight-account/freight-account-detail/freight-account-detail.component.ts create mode 100644 src/app/routes/financial-management/components/freight-account/freight-account.component.html create mode 100644 src/app/routes/financial-management/components/freight-account/freight-account.component.less create mode 100644 src/app/routes/financial-management/components/freight-account/freight-account.component.ts create mode 100644 src/app/routes/financial-management/components/main-account/main-account.component.html create mode 100644 src/app/routes/financial-management/components/main-account/main-account.component.less create mode 100644 src/app/routes/financial-management/components/main-account/main-account.component.ts create mode 100644 src/app/routes/financial-management/components/recharge-record/recharge-record.component.html create mode 100644 src/app/routes/financial-management/components/recharge-record/recharge-record.component.less create mode 100644 src/app/routes/financial-management/components/recharge-record/recharge-record.component.ts create mode 100644 src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.html create mode 100644 src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.less create mode 100644 src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.ts create mode 100644 src/app/routes/financial-management/financial-managemen-routing.module.ts create mode 100644 src/app/routes/financial-management/financial-management.module.ts diff --git a/proxy.conf.js b/proxy.conf.js index 8efd28ae..34ec1aef 100644 --- a/proxy.conf.js +++ b/proxy.conf.js @@ -14,11 +14,11 @@ module.exports = { // secure: false, // Ignore invalid SSL certificates // changeOrigin: true // } - '//cuc': { + '//api': { target: { - host: '172.30.9.44', - protocol: 'http:', - port: 8003 + host: 'tms-api-test.eascs.com', + protocol: 'https:', + port: 443 }, secure: false, changeOrigin: true, diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 58522fc1..777d8016 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -1,9 +1,10 @@ import { NgModule, Optional, SkipSelf } from '@angular/core'; +import { EATokenGuard } from './guards/token.guard'; import { throwIfAlreadyLoaded } from './module-import-guard'; @NgModule({ - providers: [] + providers: [EATokenGuard] }) export class CoreModule { constructor(@Optional() @SkipSelf() parentModule: CoreModule) { diff --git a/src/app/core/guards/token.guard.ts b/src/app/core/guards/token.guard.ts new file mode 100644 index 00000000..061317cf --- /dev/null +++ b/src/app/core/guards/token.guard.ts @@ -0,0 +1,40 @@ +import { Inject, Injectable, Injector } from '@angular/core'; +import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router'; +import { sysConf } from '@conf/sys.conf'; +import { CoreService } from '@core'; +import { ACLGuard, ACLService } from '@delon/acl'; +import { EAUserService } from '@shared'; +import { Observable, of } from 'rxjs'; + +@Injectable() +export class EATokenGuard extends ACLGuard { + constructor(srv: ACLService, router: Router, private eaUserSrv: CoreService, private router2: Router, private inject: Injector) { + super(srv, router, inject); + } + + canActivate(route: ActivatedRouteSnapshot, _state: RouterStateSnapshot | null): Observable { + const canOpen = this.eaUserSrv.loginStatus; + if (!canOpen) { + this.router2.navigate([sysConf.login_url], { + queryParams: { + returnUrl: _state?.url + } + }); + return of(!canOpen); + } + return super.canActivate(route, _state); + } + + canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + const canOpen = this.eaUserSrv.loginStatus; + if (!canOpen) { + this.router2.navigate([sysConf.login_url], { + queryParams: { + returnUrl: state?.url + } + }); + return of(!canOpen); + } + return super.canActivateChild(childRoute, state); + } +} diff --git a/src/app/core/index.ts b/src/app/core/index.ts index ebf89ced..9f525334 100644 --- a/src/app/core/index.ts +++ b/src/app/core/index.ts @@ -5,3 +5,5 @@ export * from './net/business.interceptor'; // Services export * from './core.service'; export * from './startup/startup.service'; + +export * from './guards/token.guard'; diff --git a/src/app/core/startup/startup.service.ts b/src/app/core/startup/startup.service.ts index b331af95..9f8fb87b 100644 --- a/src/app/core/startup/startup.service.ts +++ b/src/app/core/startup/startup.service.ts @@ -36,9 +36,9 @@ export class StartupService { let data; if (this.coreSrv.loginStatus) { // 本地菜单 - // data = this.loadMockData(); + data = this.loadMockData(); // 远程菜单 - data = this.loadRemoteData(); + // data = this.loadRemoteData(); } else { data = this.loadMockData(); } @@ -94,9 +94,7 @@ export class StartupService { const appData = this.httpClient.get(`assets/mocks/app-data.json`).pipe(map((res: any) => res.app)); // 用户数据 - const userData = this.coreSrv.loginStatus - ? this.httpClient.post(this.coreSrv.$api_get_current_user_info, {}).pipe(map((res: any) => res.data)) - : this.httpClient.get('assets/mocks/user-data.json').pipe(map((res: any) => res.user)); + const userData = this.httpClient.get('assets/mocks/user-data.json').pipe(map((res: any) => res.user)); // 菜单数据 const menuData = this.httpClient.get('assets/mocks/menu-data.json').pipe(map((res: any) => res.menu)); diff --git a/src/app/routes/financial-management/components/driver-account/driver-account-detail/driver-account-detail.component.html b/src/app/routes/financial-management/components/driver-account/driver-account-detail/driver-account-detail.component.html new file mode 100644 index 00000000..cf9863d6 --- /dev/null +++ b/src/app/routes/financial-management/components/driver-account/driver-account-detail/driver-account-detail.component.html @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/driver-account/driver-account-detail/driver-account-detail.component.less b/src/app/routes/financial-management/components/driver-account/driver-account-detail/driver-account-detail.component.less new file mode 100644 index 00000000..97e3643e --- /dev/null +++ b/src/app/routes/financial-management/components/driver-account/driver-account-detail/driver-account-detail.component.less @@ -0,0 +1,28 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 16px; + } + } + + nz-range-picker { + width: 100%; + } +} + +.expend-options { + margin-top: 0px; +} + +@media (min-width: 990px) { + .expend-options { + margin-top: -40px; + } + +} \ No newline at end of file diff --git a/src/app/routes/financial-management/components/driver-account/driver-account-detail/driver-account-detail.component.ts b/src/app/routes/financial-management/components/driver-account/driver-account-detail/driver-account-detail.component.ts new file mode 100644 index 00000000..c5ac8063 --- /dev/null +++ b/src/app/routes/financial-management/components/driver-account/driver-account-detail/driver-account-detail.component.ts @@ -0,0 +1,164 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from 'src/app/routes/ticket-management/services/system.service'; + +@Component({ + selector: 'app-driver-account-detail', + templateUrl: './driver-account-detail.component.html', + styleUrls: ['./driver-account-detail.component.less'] +}) +export class DriverAccountDetailComponent implements OnInit { + url = `/rule?_allow_anonymous=true`; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = [ + { title: '交易时间', index: 'updatedAt', type: 'date' }, + { title: '流水号', index: 'callNo' }, + { title: '交易类型', index: 'callNo' }, + { title: '订单号', index: 'callNo' }, + { title: '所属项目', index: 'callNo' }, + { title: '收支类型', index: 'callNo' }, + { title: '交易金额', index: 'callNo' }, + { title: '账户余额', index: 'callNo' }, + { title: '无车承运人', index: 'callNo' } + ]; + searchSchema: SFSchema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + createTime: { + title: '交易时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + orderSn2: { + type: 'string', + title: '流水号', + ui: { + placeholder: '请输入', + autocomplete: 'off' + } + }, + orderSn3: { + type: 'string', + title: '订单号', + ui: { + placeholder: '请输入', + autocomplete: 'off' + } + }, + receiveName: { + type: 'string', + title: '交易类型', + enum: [ + { label: '全部', value: '' }, + { label: '订单支付', value: '订单支付' }, + { label: '余额充值', value: '余额充值' }, + { label: '余额提现', value: '余额提现' }, + { label: '资金分配', value: '资金分配' }, + { label: '资金回收', value: '资金回收' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName = i; + this.sf?.setValue('/receiveName', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + receiveName2: { + type: 'string', + title: '收支类型', + enum: [ + { label: '全部', value: '' }, + { label: '收入', value: '收入' }, + { label: '支出', value: '支出' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName2 = i; + this.sf?.setValue('/receiveName2', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + receiveName4: { + type: 'string', + title: '无车承运人', + enum: [{ label: '全部', value: '' }], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName4 = i; + this.sf?.setValue('/receiveName4', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + } + } + }; + + reqParams = {}; + _$expand = false; + constructor(public service: TicketService) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'filter': + this.st.load(); + break; + } + } + + goBack() { + history.go(-1); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } +} diff --git a/src/app/routes/financial-management/components/driver-account/driver-account.component.html b/src/app/routes/financial-management/components/driver-account/driver-account.component.html new file mode 100644 index 00000000..e422109b --- /dev/null +++ b/src/app/routes/financial-management/components/driver-account/driver-account.component.html @@ -0,0 +1,31 @@ + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/driver-account/driver-account.component.less b/src/app/routes/financial-management/components/driver-account/driver-account.component.less new file mode 100644 index 00000000..f8d28003 --- /dev/null +++ b/src/app/routes/financial-management/components/driver-account/driver-account.component.less @@ -0,0 +1,29 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 14px; + } + } + + nz-range-picker { + width: 100%; + } +} + +.expend-options { + margin-top: 0px; +} + + +@media (min-width: 1200px) { + .expend-options { + margin-top: -40px; + } + +} \ No newline at end of file diff --git a/src/app/routes/financial-management/components/driver-account/driver-account.component.ts b/src/app/routes/financial-management/components/driver-account/driver-account.component.ts new file mode 100644 index 00000000..e5b5dff8 --- /dev/null +++ b/src/app/routes/financial-management/components/driver-account/driver-account.component.ts @@ -0,0 +1,112 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SystemService } from 'src/app/routes/sys-setting/services/system.service'; + +@Component({ + selector: 'app-driver-account', + templateUrl: './driver-account.component.html', + styleUrls: ['./driver-account.component.less'] +}) +export class DriverAccountComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + url = `/rule?_allow_anonymous=true`; + + searchSchema: SFSchema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + receiveName: { + type: 'string', + title: '司机姓名', + ui: { placeholder: '请输入' } + }, + phone: { + type: 'string', + title: '证件号码', + ui: { placeholder: '请输入' } + }, + page: { + type: 'string', + title: '手机号', + ui: { + placeholder: '请输入' + } + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + } + } + }; + + columns: STColumn[] = [ + { title: '司机姓名', index: 'description' }, + { title: '证件号码', index: 'description' }, + { title: '手机号', index: 'description' }, + { title: '账户余额', index: 'description' }, + { title: '油卡余额', index: 'description' }, + { title: '创建时间', index: 'updatedAt', type: 'date' }, + { + title: '操作', + buttons: [ + { + text: '查看明细', + click: item => this.routeTo(item) + } + ] + } + ]; + reqParams = { pageIndex: 1, pageSize: 10 }; + _$expand = false; + + constructor(public service: SystemService, private router: Router) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'filter': + this.st.load(); + break; + } + } + + routeTo(item?: any) { + this.router.navigate(['/financial-management/driver-account-detail/1']); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } +} diff --git a/src/app/routes/financial-management/components/freight-account/freight-account-detail/freight-account-detail.component.html b/src/app/routes/financial-management/components/freight-account/freight-account-detail/freight-account-detail.component.html new file mode 100644 index 00000000..4217e361 --- /dev/null +++ b/src/app/routes/financial-management/components/freight-account/freight-account-detail/freight-account-detail.component.html @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/freight-account/freight-account-detail/freight-account-detail.component.less b/src/app/routes/financial-management/components/freight-account/freight-account-detail/freight-account-detail.component.less new file mode 100644 index 00000000..97e3643e --- /dev/null +++ b/src/app/routes/financial-management/components/freight-account/freight-account-detail/freight-account-detail.component.less @@ -0,0 +1,28 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 16px; + } + } + + nz-range-picker { + width: 100%; + } +} + +.expend-options { + margin-top: 0px; +} + +@media (min-width: 990px) { + .expend-options { + margin-top: -40px; + } + +} \ No newline at end of file diff --git a/src/app/routes/financial-management/components/freight-account/freight-account-detail/freight-account-detail.component.ts b/src/app/routes/financial-management/components/freight-account/freight-account-detail/freight-account-detail.component.ts new file mode 100644 index 00000000..ee5d32b1 --- /dev/null +++ b/src/app/routes/financial-management/components/freight-account/freight-account-detail/freight-account-detail.component.ts @@ -0,0 +1,181 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFDateWidgetSchema, SFSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from 'src/app/routes/ticket-management/services/system.service'; + +@Component({ + selector: 'app-freight-account-detail', + templateUrl: './freight-account-detail.component.html', + styleUrls: ['./freight-account-detail.component.less'] +}) +export class FreightAccountDetailComponent implements OnInit { + url = `/rule?_allow_anonymous=true`; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = [ + { title: '交易时间', index: 'updatedAt', type: 'date' }, + { title: '流水号', index: 'callNo' }, + { title: '交易类型', index: 'callNo' }, + { title: '订单号', index: 'callNo' }, + { title: '所属项目', index: 'callNo' }, + { title: '收支类型', index: 'callNo' }, + { title: '交易金额', index: 'callNo' }, + { title: '账户余额', index: 'callNo' }, + { title: '无车承运人', index: 'callNo' } + ]; + searchSchema: SFSchema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + createTime: { + title: '交易时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + orderSn2: { + type: 'string', + title: '流水号', + ui: { + placeholder: '请输入', + autocomplete: 'off' + } + }, + orderSn3: { + type: 'string', + title: '订单号', + ui: { + placeholder: '请输入', + autocomplete: 'off' + } + }, + receiveName: { + type: 'string', + title: '交易类型', + enum: [ + { label: '全部', value: '' }, + { label: '订单支付', value: '订单支付' }, + { label: '余额充值', value: '余额充值' }, + { label: '余额提现', value: '余额提现' }, + { label: '资金分配', value: '资金分配' }, + { label: '资金回收', value: '资金回收' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName = i; + this.sf?.setValue('/receiveName', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + receiveName2: { + type: 'string', + title: '收支类型', + enum: [ + { label: '全部', value: '' }, + { label: '收入', value: '收入' }, + { label: '支出', value: '支出' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName2 = i; + this.sf?.setValue('/receiveName2', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + receiveName3: { + type: 'string', + title: '所属项目', + enum: [{ label: '全部', value: '' }], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName3 = i; + this.sf?.setValue('/receiveName3', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + receiveName4: { + type: 'string', + title: '无车承运人', + enum: [{ label: '全部', value: '' }], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName4 = i; + this.sf?.setValue('/receiveName4', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + } + } + }; + + reqParams = {}; + _$expand = false; + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'filter': + this.st.load(); + break; + } + } + + goBack() { + history.go(-1); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } +} diff --git a/src/app/routes/financial-management/components/freight-account/freight-account.component.html b/src/app/routes/financial-management/components/freight-account/freight-account.component.html new file mode 100644 index 00000000..064cb300 --- /dev/null +++ b/src/app/routes/financial-management/components/freight-account/freight-account.component.html @@ -0,0 +1,46 @@ + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + +
    {{item.callNo}} +
    + + + + + + + {{item.callNo}} + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/freight-account/freight-account.component.less b/src/app/routes/financial-management/components/freight-account/freight-account.component.less new file mode 100644 index 00000000..f8d28003 --- /dev/null +++ b/src/app/routes/financial-management/components/freight-account/freight-account.component.less @@ -0,0 +1,29 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 14px; + } + } + + nz-range-picker { + width: 100%; + } +} + +.expend-options { + margin-top: 0px; +} + + +@media (min-width: 1200px) { + .expend-options { + margin-top: -40px; + } + +} \ No newline at end of file diff --git a/src/app/routes/financial-management/components/freight-account/freight-account.component.ts b/src/app/routes/financial-management/components/freight-account/freight-account.component.ts new file mode 100644 index 00000000..74eca6e4 --- /dev/null +++ b/src/app/routes/financial-management/components/freight-account/freight-account.component.ts @@ -0,0 +1,148 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SystemService } from 'src/app/routes/sys-setting/services/system.service'; + +@Component({ + selector: 'app-freight-account', + templateUrl: './freight-account.component.html', + styleUrls: ['./freight-account.component.less'] +}) +export class FreightAccountComponent implements OnInit { + @ViewChild('accountModal', { static: true }) + accountModal: any; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + url = `/rule?_allow_anonymous=true`; + + searchSchema: SFSchema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + receiveName: { + type: 'string', + title: '企业名称', + ui: { placeholder: '请输入' } + }, + phone: { + type: 'string', + title: '联系人', + ui: { placeholder: '请输入' } + }, + page: { + type: 'string', + title: '联系人电话', + ui: { + placeholder: '请输入' + } + }, + createTime: { + title: '创建时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd', + visibleIf: { + expand: (value: boolean) => value + } + } as SFDateWidgetSchema + }, + receiveName2: { + type: 'string', + title: '无车承运人', + enum: [{ label: '全部', value: '全部' }], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName2 = i; + this.sf?.setValue('/receiveName2', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; + + columns: STColumn[] = [ + { title: '企业名称', index: 'description' }, + { title: '统一社会信用代码', index: 'description' }, + { title: '联系人', index: 'description' }, + { title: '联系人电话', index: 'description' }, + { title: '累计消费金额', index: 'description' }, + { title: '账户余额', render: 'description1' }, + { title: '创建时间', index: 'updatedAt', type: 'date' }, + { + title: '操作', + buttons: [ + { + text: '查看明细', + click: item => this.routeTo(item) + } + ] + } + ]; + selectedRows: any[] = []; + + reqParams = { pageIndex: 1, pageSize: 10 }; + _$expand = false; + + accountList = [{ description: 222 }, { description: 222 }, { description: 222 }]; + constructor(public service: SystemService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + break; + case 'filter': + this.st.load(); + break; + } + } + + showAccount(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '账户明细', + nzContent: this.accountModal, + nzFooter: [] + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + + routeTo(item?: any) { + this.router.navigate(['/financial-management/freight-account-detail/1']); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } +} diff --git a/src/app/routes/financial-management/components/main-account/main-account.component.html b/src/app/routes/financial-management/components/main-account/main-account.component.html new file mode 100644 index 00000000..d77a59d2 --- /dev/null +++ b/src/app/routes/financial-management/components/main-account/main-account.component.html @@ -0,0 +1,26 @@ + + + + +
    +
    + +
    +
    + + + +
    +
    +
    + + + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/main-account/main-account.component.less b/src/app/routes/financial-management/components/main-account/main-account.component.less new file mode 100644 index 00000000..607d94b6 --- /dev/null +++ b/src/app/routes/financial-management/components/main-account/main-account.component.less @@ -0,0 +1,13 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 14px; + } + } +} \ No newline at end of file diff --git a/src/app/routes/financial-management/components/main-account/main-account.component.ts b/src/app/routes/financial-management/components/main-account/main-account.component.ts new file mode 100644 index 00000000..0b59dd38 --- /dev/null +++ b/src/app/routes/financial-management/components/main-account/main-account.component.ts @@ -0,0 +1,89 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { SystemService } from 'src/app/routes/sys-setting/services/system.service'; + +@Component({ + selector: 'app-main-account', + templateUrl: './main-account.component.html', + styleUrls: ['./main-account.component.less'] +}) +export class MainAccountComponent implements OnInit { + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + + url = `/rule?_allow_anonymous=true`; + + searchSchema: SFSchema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + receiveName: { + type: 'string', + title: '公司名称', + ui: { placeholder: '请输入' } + }, + phone: { + type: 'string', + title: '纳税人识别号', + ui: { placeholder: '请输入' } + } + } + }; + + columns: STColumn[] = [ + { title: '公司名称', index: 'description' }, + { title: '纳税人识别号', index: 'description' }, + { title: '发票税率', index: 'description' }, + { title: '电子发票账号', index: 'description' }, + { title: 'ETC账号', index: 'description' }, + { title: '电子合同账号', index: 'description' }, + { title: '开户行', index: 'description' }, + { title: '虚拟账户', index: 'description' }, + { title: '附加费比例', index: 'description' }, + { + title: '操作', + buttons: [ + { + text: '财务设置', + click: item => this.routeTo(item) + }, + { + text: '合同设置', + click: item => this.routeTo(item) + } + ] + } + ]; + reqParams = { pageIndex: 1, pageSize: 10 }; + + constructor(public service: SystemService, private router: Router) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'filter': + this.st.load(); + break; + } + } + + routeTo(item?: any) { + this.router.navigate(['/financial-management/driver-account-detail/1']); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + } +} diff --git a/src/app/routes/financial-management/components/recharge-record/recharge-record.component.html b/src/app/routes/financial-management/components/recharge-record/recharge-record.component.html new file mode 100644 index 00000000..7e99d504 --- /dev/null +++ b/src/app/routes/financial-management/components/recharge-record/recharge-record.component.html @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/recharge-record/recharge-record.component.less b/src/app/routes/financial-management/components/recharge-record/recharge-record.component.less new file mode 100644 index 00000000..97e3643e --- /dev/null +++ b/src/app/routes/financial-management/components/recharge-record/recharge-record.component.less @@ -0,0 +1,28 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 16px; + } + } + + nz-range-picker { + width: 100%; + } +} + +.expend-options { + margin-top: 0px; +} + +@media (min-width: 990px) { + .expend-options { + margin-top: -40px; + } + +} \ No newline at end of file diff --git a/src/app/routes/financial-management/components/recharge-record/recharge-record.component.ts b/src/app/routes/financial-management/components/recharge-record/recharge-record.component.ts new file mode 100644 index 00000000..2b0e69aa --- /dev/null +++ b/src/app/routes/financial-management/components/recharge-record/recharge-record.component.ts @@ -0,0 +1,157 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { TicketService } from 'src/app/routes/ticket-management/services/system.service'; + +@Component({ + selector: 'app-recharge-record', + templateUrl: './recharge-record.component.html', + styleUrls: ['./recharge-record.component.less'] +}) +export class RechargeRecordComponent implements OnInit { + url = `/rule?_allow_anonymous=true`; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + columns: STColumn[] = [ + { title: '充值时间', index: 'updatedAt', type: 'date' }, + { title: '充值单号', index: 'callNo' }, + { title: '账户主体', index: 'callNo' }, + { title: '账户名称', index: 'callNo' }, + { title: '虚拟账户', index: 'callNo' }, + { title: '账户类型', index: 'callNo' }, + { title: '充值金额', index: 'callNo' }, + { title: '充值方式', index: 'callNo' }, + { title: '充值状态', index: 'callNo' }, + { title: '银行流水号', index: 'callNo' } + ]; + searchSchema: SFSchema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + orderSn2: { + type: 'string', + title: '充值单号', + ui: { + placeholder: '请输入', + autocomplete: 'off' + } + }, + receiveName: { + type: 'string', + title: '充值状态', + enum: [ + { label: '全部', value: '' }, + { label: '充值中', value: '充值中' }, + { label: '已完成', value: '已完成' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName = i; + this.sf?.setValue('/receiveName', i); + } + }, + default: '' + }, + createTime: { + title: '充值时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema + }, + orderSn3: { + type: 'string', + title: '账户名称', + ui: { + placeholder: '请输入', + autocomplete: 'off', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + receiveName2: { + type: 'string', + title: '账户类型', + enum: [ + { label: '全部', value: '' }, + { label: '个人', value: '个人' }, + { label: '企业', value: '企业' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName2 = i; + this.sf?.setValue('/receiveName2', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + }, + receiveName4: { + type: 'string', + title: '账户主体', + enum: [{ label: '全部', value: '' }], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName4 = i; + this.sf?.setValue('/receiveName4', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + }, + default: '' + } + } + }; + + reqParams = {}; + _$expand = false; + constructor(public service: TicketService) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'filter': + this.st.load(); + break; + } + } + + goBack() { + history.go(-1); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } +} diff --git a/src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.html b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.html new file mode 100644 index 00000000..e54a033b --- /dev/null +++ b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.html @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + +
    +
    +
    + + + + + + + + + +
    + +
    + 已选择 + {{ selectedRows.length }} 条数据   累计提现 {{ + totalCallNo }} + 清空 +
    +
    + + +
    + + +
    +
    + + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.less b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.less new file mode 100644 index 00000000..d8a7024c --- /dev/null +++ b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.less @@ -0,0 +1,22 @@ +:host::ng-deep { + .search-box { + .ant-card-body { + padding-bottom: 18px; + } + } + + .content-box { + .ant-card-body { + padding-top: 0; + } + } + + nz-range-picker { + width: 100%; + } + + .ant-tabs-tab-btn { + padding-left : 16px; + padding-right: 16px; + } +} diff --git a/src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.ts b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.ts new file mode 100644 index 00000000..f802b078 --- /dev/null +++ b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.ts @@ -0,0 +1,227 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { STComponent, STColumn, STChange } from '@delon/abc/st'; +import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { TicketService } from 'src/app/routes/ticket-management/services/system.service'; + +@Component({ + selector: 'app-withdrawals-record', + templateUrl: './withdrawals-record.component.html', + styleUrls: ['./withdrawals-record.component.less'] +}) +export class WithdrawalsRecordComponent implements OnInit { + url = `/rule?_allow_anonymous=true`; + @ViewChild('st', { static: true }) + st!: STComponent; + @ViewChild('sf', { static: false }) + sf!: SFComponent; + @ViewChild('auditModal', { static: false }) + auditModal!: any; + columns: STColumn[] = [ + { title: '', index: 'key', type: 'checkbox' }, + { title: '提现时间', index: 'no' }, + { title: '提现单号', index: 'callNo' }, + { title: '账户主体', index: 'callNo' }, + { title: '账户名称', index: 'callNo' }, + { title: '虚拟账户', index: 'callNo' }, + { title: '账户类型', index: 'callNo' }, + { title: '提现金额', index: 'callNo' }, + { title: '提现手续费', index: 'callNo' }, + { title: '银行账户', index: 'callNo' }, + { title: '提现状态', index: 'callNo' }, + { + title: '操作', + buttons: [ + { + text: '审核', + click: item => this.auditAction(item) + }, + { + text: '详情', + click: item => this.routeTo(item) + } + ] + } + ]; + searchSchema: SFSchema = { + properties: { + expand: { + type: 'boolean', + ui: { + hidden: true + } + }, + orderSn: { + type: 'string', + title: '提现单号', + ui: { + autocomplete: 'off' + } + }, + receiveName: { + type: 'string', + title: '提现状态', + enum: [ + { label: '全部', value: '全部' }, + { label: '待审核', value: '待审核' }, + { label: '处理中', value: '处理中' }, + { label: '已完成', value: '已完成' }, + { label: '已拒绝', value: '已拒绝' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName = i; + this.sf?.setValue('/receiveName', i); + } + } + }, + createTime: { + title: '提现时间', + type: 'string', + ui: { + widget: 'date', + mode: 'range', + format: 'yyyy-MM-dd' + } as SFDateWidgetSchema + }, + orderSn2: { + type: 'string', + title: '账户名称', + ui: { + placeholder: '请输入', + autocomplete: 'off', + visibleIf: { + expand: (value: boolean) => value + } + } + }, + receiveName2: { + type: 'string', + title: '账户类型', + enum: [ + { label: '全部', value: '全部' }, + { label: '个人', value: '个人' }, + { label: '企业', value: '企业' } + ], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName2 = i; + this.sf?.setValue('/receiveName2', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + } + }, + receiveName3: { + type: 'string', + title: '账户主体', + enum: [{ label: '全部', value: '全部' }], + ui: { + widget: 'select', + placeholder: '请选择', + change: (i: any) => { + this.sf.value.receiveName3 = i; + this.sf?.setValue('/receiveName3', i); + }, + visibleIf: { + expand: (value: boolean) => value + } + } + } + } + }; + + reqParams = {}; + + _$expand = false; + + selectedRows: any[] = []; + totalCallNo = 0; + constructor(public service: TicketService, private nzModalService: NzModalService, private router: Router) {} + + ngOnInit(): void {} + + stChange(e: STChange): void { + switch (e.type) { + case 'checkbox': + this.selectedRows = e.checkbox!; + this.totalCallNo = this.selectedRows.reduce((total, cv) => total + cv.callNo, 0); + break; + case 'filter': + this.st.load(); + break; + } + } + + approval(): void {} + + add(): void {} + + routeTo(item: any) { + this.router.navigate(['/ticket/invoice-requested-detail/1']); + } + + auditAction(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '审核', + nzContent: this.auditModal, + nzFooter: [ + { + label: '拒绝', + type: 'default', + onClick: () => { + modal.destroy(); + } + }, + { + label: '通过', + type: 'primary', + onClick: () => { + modal.destroy(); + } + } + ] + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + + showReason(item: any) { + const modal = this.nzModalService.create({ + nzTitle: '查看原因', + nzContent: '运单数据异常,暂时无法开票,请联系客服400-xxxx-xxxx', + nzFooter: [ + { + label: '关闭', + type: 'primary', + onClick: () => { + modal.destroy(); + } + } + ] + }); + } + + /** + * 重置表单 + */ + resetSF() { + this.sf.reset(); + this._$expand = false; + } + + /** + * 伸缩查询条件 + */ + expandToggle() { + this._$expand = !this._$expand; + this.sf?.setValue('/expand', this._$expand); + } +} diff --git a/src/app/routes/financial-management/financial-managemen-routing.module.ts b/src/app/routes/financial-management/financial-managemen-routing.module.ts new file mode 100644 index 00000000..4bc5c3c7 --- /dev/null +++ b/src/app/routes/financial-management/financial-managemen-routing.module.ts @@ -0,0 +1,25 @@ +import { FreightAccountComponent } from './components/freight-account/freight-account.component'; +import { DriverAccountComponent } from './components/driver-account/driver-account.component'; +import { RechargeRecordComponent } from './components/recharge-record/recharge-record.component'; +import { WithdrawalsRecordComponent } from './components/withdrawals-record/withdrawals-record.component'; +import { MainAccountComponent } from './components/main-account/main-account.component'; +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { FreightAccountDetailComponent } from './components/freight-account/freight-account-detail/freight-account-detail.component'; +import { DriverAccountDetailComponent } from './components/driver-account/driver-account-detail/driver-account-detail.component'; + +const routes: Routes = [ + { path: 'freight-account', component: FreightAccountComponent }, + { path: 'freight-account-detail/:id', component: FreightAccountDetailComponent }, + { path: 'driver-account', component: DriverAccountComponent }, + { path: 'driver-account-detail/:id', component: DriverAccountDetailComponent }, + { path: 'recharge-record', component: RechargeRecordComponent }, + { path: 'withdrawals-record', component: WithdrawalsRecordComponent }, + { path: 'main-account', component: MainAccountComponent } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class FinancialManagementRoutingModule {} diff --git a/src/app/routes/financial-management/financial-management.module.ts b/src/app/routes/financial-management/financial-management.module.ts new file mode 100644 index 00000000..14b718e6 --- /dev/null +++ b/src/app/routes/financial-management/financial-management.module.ts @@ -0,0 +1,27 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FreightAccountComponent } from './components/freight-account/freight-account.component'; +import { DriverAccountComponent } from './components/driver-account/driver-account.component'; +import { RechargeRecordComponent } from './components/recharge-record/recharge-record.component'; +import { WithdrawalsRecordComponent } from './components/withdrawals-record/withdrawals-record.component'; +import { MainAccountComponent } from './components/main-account/main-account.component'; +import { SharedModule } from '@shared'; +import { FinancialManagementRoutingModule } from './financial-managemen-routing.module'; +import { FreightAccountDetailComponent } from './components/freight-account/freight-account-detail/freight-account-detail.component'; +import { DriverAccountDetailComponent } from './components/driver-account/driver-account-detail/driver-account-detail.component'; + +const ROUTESCOMPONENTS = [ + FreightAccountComponent, + DriverAccountComponent, + RechargeRecordComponent, + WithdrawalsRecordComponent, + MainAccountComponent +]; + +const NOTROUTECOMPONENTS = [DriverAccountDetailComponent, FreightAccountDetailComponent]; + +@NgModule({ + declarations: [...ROUTESCOMPONENTS, ...NOTROUTECOMPONENTS], + imports: [CommonModule, FinancialManagementRoutingModule, SharedModule] +}) +export class FinancialManagementModule {} diff --git a/src/app/routes/routes-routing.module.ts b/src/app/routes/routes-routing.module.ts index 930bd03e..3872b60b 100644 --- a/src/app/routes/routes-routing.module.ts +++ b/src/app/routes/routes-routing.module.ts @@ -10,6 +10,7 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; // layout import { LayoutProComponent } from '@brand'; +import { EATokenGuard } from '@core'; import { environment } from '@env/environment'; // dashboard pages @@ -19,6 +20,8 @@ const routes: Routes = [ { path: '', component: LayoutProComponent, + canActivate: [EATokenGuard], + canActivateChild: [EATokenGuard], children: [ { path: '', redirectTo: 'dashboard', pathMatch: 'full' }, { path: 'dashboard', component: DashboardComponent }, @@ -38,6 +41,7 @@ const routes: Routes = [ { path: 'supply-management', loadChildren: () => import('./supply-management/supply-management.module').then((m) => m.SupplyManagementModule) }, { path: 'order-management', loadChildren: () => import('./order-management/order-management.module').then((m) => m.OrderManagementModule) }, { path: 'waybill-management', loadChildren: () => import('./waybill-management/waybill-management.module').then((m) => m.WaybillManagementModule) }, + { path: 'financial-management', loadChildren: () => import('./financial-management/financial-management.module').then((m) => m.FinancialManagementModule) }, ] }, // passport diff --git a/src/app/shared/services/business/user.service.ts b/src/app/shared/services/business/user.service.ts index 43be9ca4..06b257b0 100644 --- a/src/app/shared/services/business/user.service.ts +++ b/src/app/shared/services/business/user.service.ts @@ -25,7 +25,7 @@ export class EAUserService extends BaseService { /** * 账号密码登录 */ - $api_login_by_account = `/cuc/user/login?_allow_anonymous=true`; + $api_login_by_account = `/api/mdc/cuc/user/login?_allow_anonymous=true`; /** * 手机号登录 */ @@ -117,14 +117,15 @@ export class EAUserService extends BaseService { if (res?.token) { this.tokenSrv.set({ token: res.token }); this.doAfterLogin(); + this.router.navigate([this.ar.snapshot.queryParams.returnUrl || '/']); // this.eventSrv.event.emit(eventConf.reflesh_login_status, this.ar.snapshot.queryParams.returnUrl || '/'); } }); } async doAfterLogin() { - await this.loadUserInfo(); - await this.loadUserMenus(); + // await this.loadUserInfo(); + // await this.loadUserMenus(); await this.loadUserRoles(); } diff --git a/src/assets/mocks/menu-data.json b/src/assets/mocks/menu-data.json index e5b4fb6d..e92ef85b 100644 --- a/src/assets/mocks/menu-data.json +++ b/src/assets/mocks/menu-data.json @@ -98,8 +98,9 @@ "icon": "anticon anticon-dashboard", "link": "/usercenter/driver/captain" } + ] + } ] - }] }, { "text": "票务管理", @@ -141,12 +142,19 @@ "text": "货源管理", "icon": "anticon anticon-dashboard", "group": true, - "children": [{ + "children": [ + { "text": "货源管理", "icon": "anticon anticon-dashboard", "link": "/supply-management/index", "reuse": true }, + { + "text": "货源管理", + "icon": "anticon anticon-dashboard", + "link": "/supply-management/index", + "hide": true + }, { "text": "货源详情", "icon": "anticon anticon-dashboard", @@ -196,7 +204,7 @@ "icon": "anticon anticon-dashboard", "link": "/order-management/car-manage" } - ] + ] }, { "text": "补录单", @@ -212,7 +220,7 @@ "link": "/order-management/additionalc-detail/:id", "hide": true } - ] + ] }, { "text": "风险单管理", @@ -285,6 +293,38 @@ } ] }, + { + "text": "财务管理", + "icon": "anticon anticon-dashboard", + "group": true, + "children": [ + { + "text": "货主账户", + "icon": "anticon anticon-dashboard", + "link": "/financial-management/freight-account" + }, + { + "text": "司机账户", + "icon": "anticon anticon-dashboard", + "link": "/financial-management/driver-account" + }, + { + "text": "充值记录", + "icon": "anticon anticon-dashboard", + "link": "/financial-management/recharge-record" + }, + { + "text": "提现记录", + "icon": "anticon anticon-dashboard", + "link": "/financial-management/withdrawals-record" + }, + { + "text": "账户主体", + "icon": "anticon anticon-dashboard", + "link": "/financial-management/main-account" + } + ] + }, { "text": "系统设置", "icon": "anticon anticon-dashboard", diff --git a/src/conf/sys.conf.ts b/src/conf/sys.conf.ts index c28d18bf..450ddcde 100644 --- a/src/conf/sys.conf.ts +++ b/src/conf/sys.conf.ts @@ -15,7 +15,7 @@ export const sysConf = { /** * 登录路径 */ - login_url: `/account/login`, + login_url: `/passport/login`, /** * 缓存过期时间 */ From 4ad7282e51918275641ffcbc4c796a1b49acc88f Mon Sep 17 00:00:00 2001 From: Taric Xin Date: Tue, 7 Dec 2021 19:53:27 +0800 Subject: [PATCH 0052/1600] =?UTF-8?q?=E6=89=8B=E6=9C=BA=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../passport/components/login/login.component.ts | 4 +--- src/app/shared/services/business/user.service.ts | 11 +++++------ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/app/routes/passport/components/login/login.component.ts b/src/app/routes/passport/components/login/login.component.ts index b294f539..23a21c73 100644 --- a/src/app/routes/passport/components/login/login.component.ts +++ b/src/app/routes/passport/components/login/login.component.ts @@ -188,11 +188,9 @@ export class UserLoginComponent implements OnInit, OnDestroy { if (!this.captchaSF.valid) { return; } - // this.userSrv.loginByCaptcha(this.captchaSF.value.phone, this.captchaSF.value.smsCode, this.captchaSF.value.sc); + this.userSrv.loginByMobile(this.captchaSF.value.phone, this.captchaSF.value.smsCode, this.captchaSF.value.sc); } else { this.accountSF.validator({ emitError: true }); - console.log(this.accountSF.value); - if (!this.accountSF.valid) { return; } diff --git a/src/app/shared/services/business/user.service.ts b/src/app/shared/services/business/user.service.ts index 06b257b0..0fee00cb 100644 --- a/src/app/shared/services/business/user.service.ts +++ b/src/app/shared/services/business/user.service.ts @@ -29,7 +29,7 @@ export class EAUserService extends BaseService { /** * 手机号登录 */ - $api_login_by_mobile = `/scce/cuc/cuc/user/sms/login?_allow_anonymous=true`; + $api_login_by_mobile = `/api/mdc/cuc/user/sms/login?_allow_anonymous=true`; // 登录路径 private $api_login = `/scce/cuc/cuc/user/login?_allow_anonymous=true`; private $api_captcha_login = `/scce/cuc/cuc/user/sms/login?_allow_anonymous=true`; @@ -99,10 +99,10 @@ export class EAUserService extends BaseService { loginByMobile(mobile: string, captcha: string, sc: string) { this.asyncRequest(this.$api_login_by_mobile, { phone: mobile, smsCode: captcha, sc }, 'POST', true, 'FORM').then((res) => { if (res?.token) { - this.cacheSrv.set(cacheConf.token, res.token); + // this.cacheSrv.set(cacheConf.token, res.token); + this.tokenSrv.set({ token: res.token }); this.doAfterLogin(); - // this.eventSrv.event.emit(eventConf.reflesh_login_status); - this.router.navigate([this.ar.snapshot.queryParams.returnUrl || '/']); + this.router.navigate(['/']); } }); } @@ -117,8 +117,7 @@ export class EAUserService extends BaseService { if (res?.token) { this.tokenSrv.set({ token: res.token }); this.doAfterLogin(); - this.router.navigate([this.ar.snapshot.queryParams.returnUrl || '/']); - // this.eventSrv.event.emit(eventConf.reflesh_login_status, this.ar.snapshot.queryParams.returnUrl || '/'); + this.router.navigate(['/']); } }); } From 66283ddc3d513c53cfd942581c8bd0e093045400 Mon Sep 17 00:00:00 2001 From: Taric Xin Date: Tue, 7 Dec 2021 20:56:18 +0800 Subject: [PATCH 0053/1600] edit --- .../main-account/main-account.component.ts | 18 ++- .../setting-financial.component.html | 11 ++ .../setting-financial.component.less | 0 .../setting-financial.component.ts | 130 ++++++++++++++++++ .../withdrawals-detail.component.html | 50 +++++++ .../withdrawals-detail.component.less | 17 +++ .../withdrawals-detail.component.ts | 17 +++ .../withdrawals-record.component.ts | 2 +- .../financial-managemen-routing.module.ts | 2 + .../financial-management.module.ts | 7 +- src/assets/mocks/menu-data.json | 5 - 11 files changed, 249 insertions(+), 10 deletions(-) create mode 100644 src/app/routes/financial-management/components/main-account/setting-financial/setting-financial.component.html create mode 100644 src/app/routes/financial-management/components/main-account/setting-financial/setting-financial.component.less create mode 100644 src/app/routes/financial-management/components/main-account/setting-financial/setting-financial.component.ts create mode 100644 src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.html create mode 100644 src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.less create mode 100644 src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.ts diff --git a/src/app/routes/financial-management/components/main-account/main-account.component.ts b/src/app/routes/financial-management/components/main-account/main-account.component.ts index 0b59dd38..d15f1d0b 100644 --- a/src/app/routes/financial-management/components/main-account/main-account.component.ts +++ b/src/app/routes/financial-management/components/main-account/main-account.component.ts @@ -2,7 +2,10 @@ import { Component, OnInit, ViewChild } from '@angular/core'; import { Router } from '@angular/router'; import { STComponent, STColumn, STChange } from '@delon/abc/st'; import { SFComponent, SFSchema, SFDateWidgetSchema } from '@delon/form'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { SystemStaffStaffModalComponent } from 'src/app/routes/sys-setting/components/staff-management/staff-modal/staff-modal.component'; import { SystemService } from 'src/app/routes/sys-setting/services/system.service'; +import { SettingFinancialComponent } from './setting-financial/setting-financial.component'; @Component({ selector: 'app-main-account', @@ -53,7 +56,7 @@ export class MainAccountComponent implements OnInit { buttons: [ { text: '财务设置', - click: item => this.routeTo(item) + click: item => this.settingFinanical(item) }, { text: '合同设置', @@ -64,7 +67,7 @@ export class MainAccountComponent implements OnInit { ]; reqParams = { pageIndex: 1, pageSize: 10 }; - constructor(public service: SystemService, private router: Router) {} + constructor(public service: SystemService, private router: Router, private nzModalService: NzModalService) {} ngOnInit(): void {} @@ -76,6 +79,17 @@ export class MainAccountComponent implements OnInit { } } + settingFinanical(item: any) { + const modal = this.nzModalService.create({ + nzContent: SettingFinancialComponent, + nzComponentParams: item ? { i: { ...item, roleId: '1,2,3', name: '用户名', phone: 18555555555 } } : { i: { id: 0 } }, + nzFooter: null + }); + modal.afterClose.subscribe(res => { + this.st.load(); + }); + } + routeTo(item?: any) { this.router.navigate(['/financial-management/driver-account-detail/1']); } diff --git a/src/app/routes/financial-management/components/main-account/setting-financial/setting-financial.component.html b/src/app/routes/financial-management/components/main-account/setting-financial/setting-financial.component.html new file mode 100644 index 00000000..10785fb6 --- /dev/null +++ b/src/app/routes/financial-management/components/main-account/setting-financial/setting-financial.component.html @@ -0,0 +1,11 @@ + +
    + + +
    + \ No newline at end of file diff --git a/src/app/routes/financial-management/components/main-account/setting-financial/setting-financial.component.less b/src/app/routes/financial-management/components/main-account/setting-financial/setting-financial.component.less new file mode 100644 index 00000000..e69de29b diff --git a/src/app/routes/financial-management/components/main-account/setting-financial/setting-financial.component.ts b/src/app/routes/financial-management/components/main-account/setting-financial/setting-financial.component.ts new file mode 100644 index 00000000..8a9865ba --- /dev/null +++ b/src/app/routes/financial-management/components/main-account/setting-financial/setting-financial.component.ts @@ -0,0 +1,130 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; +import { EAEnterpriseService } from '@shared'; +import { NzMessageService } from 'ng-zorro-antd/message'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { SystemService } from 'src/app/routes/sys-setting/services/system.service'; + +@Component({ + selector: 'app-setting-financial', + templateUrl: './setting-financial.component.html', + styleUrls: ['./setting-financial.component.less'] +}) +export class SettingFinancialComponent implements OnInit { + @ViewChild('sf', { static: false }) + sf!: SFComponent; + i: any; + schema!: SFSchema; + roleList = []; + roleNames: any = []; + constructor( + private modal: NzModalRef, + public msgSrv: NzMessageService, + public service: SystemService, + private enterpriseSrv: EAEnterpriseService + ) {} + + ngOnInit(): void { + if (this.i?.id !== 0) { + this.i.roleIds = this.i.roleId !== '' ? this.i.roleId.split(',') : []; + } + + this.initSF(this.i); + } + initSF(staff: any) { + console.log(staff); + this.schema = { + properties: { + name: { + title: '公司名称', + type: 'string', + ui: { widget: 'string', placeholder: '请输入公司名称' }, + default: staff.name + }, + phone: { + title: '纳税人识别号', + type: 'string', + format: 'mobile', + ui: { widget: 'string', placeholder: '请输入纳税人识别号' }, + default: staff.phone + }, + phone2: { + title: '税收分类编码', + type: 'string', + format: 'mobile', + ui: { widget: 'string', placeholder: '请输入税收分类编码' }, + default: staff.phone + }, + phone3: { + title: '发票税率', + type: 'string', + format: 'mobile', + ui: { widget: 'string', placeholder: '请输入发票税率' }, + default: staff.phone + }, + phone4: { + title: '附加费比例', + type: 'string', + format: 'mobile', + ui: { widget: 'string', placeholder: '请输入附加费比例' }, + default: staff.phone + } + }, + required: ['name', 'phone', 'phone2', 'phone3', 'phone4'] + }; + } + + sure() { + if (!this.sf.value.roleIds || this.sf.value.roleIds.length === 0) { + this.service.msgSrv.error('员工角色不能为空!'); + return; + } + this.roleNames = []; + this.roleList.forEach((item: { id: any; roleName: string }) => { + this.sf.value.roleIds.forEach((ele: any) => { + if (ele === item.id) { + this.roleNames.push(item.roleName); + } + }); + }); + if (this.i.id === 0) { + const params: any = { + ...this.sf.value, + roleId: this.sf.value.roleIds, + roleNames: this.roleNames.join(','), + telephone: this.sf.value.phone, + staffName: this.sf.value.name + }; + // this.service.request(this.service.$api_addStaff, params).subscribe((res) => { + // console.log(res); + // if (res) { + // this.service.msgSrv.success('保存成功!'); + // this.modal.close(true); + // } + // // this.showInviteFlag = true; + // // this.inviteCode = res.inviteCode; + // }); + } else { + const params: any = { + appUserId: this.i.appUserId, + staffName: this.sf.value.name, + roleId: this.sf.value.roleIds, + telephone: this.i.telephone + }; + // this.service.request(this.service.$api_editorStaff, params).subscribe((res) => { + // this.service.msgSrv.success('编辑成功!'); + // // this.loadMyIdentity(); + // this.modal.close(true); + // }); + } + } + loadMyIdentity() { + this.enterpriseSrv.loadEnterpises().subscribe((data: any[]) => { + this.enterpriseSrv.setCache(data); + }); + } + + close() { + this.modal.destroy(); + } +} diff --git a/src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.html b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.html new file mode 100644 index 00000000..b808d0a0 --- /dev/null +++ b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.html @@ -0,0 +1,50 @@ + + + + + + + + +
    + + 天津怡亚通物流科技有限公司 + + + EA202110012313 + + + 已完成 + + + 2021-10-11 08:50:08 + + + 茅台集团 + + + 6202110111234 + + + 10000.00 + + + 10.00 + + + 招商银行(8889) + + + P20181230123012385756 + +
    + + +
    +
    + +
    +
    +
    \ No newline at end of file diff --git a/src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.less b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.less new file mode 100644 index 00000000..e299b7d1 --- /dev/null +++ b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.less @@ -0,0 +1,17 @@ +:host::ng-deep { + + .ant-alert-info { + background-color: #f3f3f3; + border : 1px solid #dbdbdb; + + .ant-alert-message { + color: rgba(0, 0, 0, 0.85); + font-weight: 600; + font-size: 16px; + } + } + + .ant-form-item { + margin-bottom: 15px; + } +} \ No newline at end of file diff --git a/src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.ts b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.ts new file mode 100644 index 00000000..ad974c63 --- /dev/null +++ b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-detail/withdrawals-detail.component.ts @@ -0,0 +1,17 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-withdrawals-detail', + templateUrl: './withdrawals-detail.component.html', + styleUrls: ['./withdrawals-detail.component.less'] +}) +export class WithdrawalsDetailComponent implements OnInit { + formDate: any = {}; + constructor() {} + + ngOnInit(): void {} + + goBack() { + history.go(-1); + } +} diff --git a/src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.ts b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.ts index f802b078..44588236 100644 --- a/src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.ts +++ b/src/app/routes/financial-management/components/withdrawals-record/withdrawals-record.component.ts @@ -164,7 +164,7 @@ export class WithdrawalsRecordComponent implements OnInit { add(): void {} routeTo(item: any) { - this.router.navigate(['/ticket/invoice-requested-detail/1']); + this.router.navigate(['/financial-management/withdrawals-detail/1']); } auditAction(item: any) { diff --git a/src/app/routes/financial-management/financial-managemen-routing.module.ts b/src/app/routes/financial-management/financial-managemen-routing.module.ts index 4bc5c3c7..8027248a 100644 --- a/src/app/routes/financial-management/financial-managemen-routing.module.ts +++ b/src/app/routes/financial-management/financial-managemen-routing.module.ts @@ -7,6 +7,7 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { FreightAccountDetailComponent } from './components/freight-account/freight-account-detail/freight-account-detail.component'; import { DriverAccountDetailComponent } from './components/driver-account/driver-account-detail/driver-account-detail.component'; +import { WithdrawalsDetailComponent } from './components/withdrawals-record/withdrawals-detail/withdrawals-detail.component'; const routes: Routes = [ { path: 'freight-account', component: FreightAccountComponent }, @@ -15,6 +16,7 @@ const routes: Routes = [ { path: 'driver-account-detail/:id', component: DriverAccountDetailComponent }, { path: 'recharge-record', component: RechargeRecordComponent }, { path: 'withdrawals-record', component: WithdrawalsRecordComponent }, + { path: 'withdrawals-detail/:id', component: WithdrawalsDetailComponent }, { path: 'main-account', component: MainAccountComponent } ]; diff --git a/src/app/routes/financial-management/financial-management.module.ts b/src/app/routes/financial-management/financial-management.module.ts index 14b718e6..ec200d1e 100644 --- a/src/app/routes/financial-management/financial-management.module.ts +++ b/src/app/routes/financial-management/financial-management.module.ts @@ -9,16 +9,19 @@ import { SharedModule } from '@shared'; import { FinancialManagementRoutingModule } from './financial-managemen-routing.module'; import { FreightAccountDetailComponent } from './components/freight-account/freight-account-detail/freight-account-detail.component'; import { DriverAccountDetailComponent } from './components/driver-account/driver-account-detail/driver-account-detail.component'; +import { SettingFinancialComponent } from './components/main-account/setting-financial/setting-financial.component'; +import { WithdrawalsDetailComponent } from './components/withdrawals-record/withdrawals-detail/withdrawals-detail.component'; const ROUTESCOMPONENTS = [ FreightAccountComponent, DriverAccountComponent, RechargeRecordComponent, WithdrawalsRecordComponent, - MainAccountComponent + MainAccountComponent, + WithdrawalsDetailComponent ]; -const NOTROUTECOMPONENTS = [DriverAccountDetailComponent, FreightAccountDetailComponent]; +const NOTROUTECOMPONENTS = [DriverAccountDetailComponent, FreightAccountDetailComponent, SettingFinancialComponent]; @NgModule({ declarations: [...ROUTESCOMPONENTS, ...NOTROUTECOMPONENTS], diff --git a/src/assets/mocks/menu-data.json b/src/assets/mocks/menu-data.json index 63354c9a..8bb7c691 100644 --- a/src/assets/mocks/menu-data.json +++ b/src/assets/mocks/menu-data.json @@ -4,11 +4,6 @@ "text": "样例", "hideInBreadcrumb": true, "children": [ - { - "text": "仪表盘", - "icon": "anticon anticon-dashboard", - "link": "/dashboard" - }, { "text": "样例", "icon": "anticon anticon-dashboard", From 348d69d96badf6ac211e36c38b37fe7986b0a470 Mon Sep 17 00:00:00 2001 From: Taric Xin Date: Wed, 8 Dec 2021 09:32:47 +0800 Subject: [PATCH 0054/1600] edit --- src/environments/eascs/environment.demo.ts | 2 +- src/environments/eascs/environment.dev.ts | 2 +- src/environments/eascs/environment.pre.ts | 2 +- src/environments/eascs/environment.prod.ts | 2 +- src/environments/environment.prod.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/environments/eascs/environment.demo.ts b/src/environments/eascs/environment.demo.ts index 0b90a716..5b0c4086 100644 --- a/src/environments/eascs/environment.demo.ts +++ b/src/environments/eascs/environment.demo.ts @@ -12,7 +12,7 @@ export const environment = { production: true, useHash: true, api: { - baseUrl: 'https://scm-api-test.eascs.com', + baseUrl: 'https://tms-api-test.eascs.com', refreshTokenEnabled: false, refreshTokenType: 'auth-refresh', }, diff --git a/src/environments/eascs/environment.dev.ts b/src/environments/eascs/environment.dev.ts index d4f0476c..f6d00fed 100644 --- a/src/environments/eascs/environment.dev.ts +++ b/src/environments/eascs/environment.dev.ts @@ -12,7 +12,7 @@ export const environment = { production: true, useHash: true, api: { - baseUrl: 'https://scm-api-test.eascs.com', + baseUrl: 'https://tms-api-test.eascs.com', refreshTokenEnabled: false, refreshTokenType: 'auth-refresh', }, diff --git a/src/environments/eascs/environment.pre.ts b/src/environments/eascs/environment.pre.ts index 94f745b7..0449f0d0 100644 --- a/src/environments/eascs/environment.pre.ts +++ b/src/environments/eascs/environment.pre.ts @@ -4,7 +4,7 @@ export const environment = { production: true, useHash: true, api: { - baseUrl: 'https://scm-api-pre.eascs.com', + baseUrl: 'https://tms-api-test.eascs.com', refreshTokenEnabled: false, refreshTokenType: 'auth-refresh', }, diff --git a/src/environments/eascs/environment.prod.ts b/src/environments/eascs/environment.prod.ts index 25a7ea67..0449f0d0 100644 --- a/src/environments/eascs/environment.prod.ts +++ b/src/environments/eascs/environment.prod.ts @@ -4,7 +4,7 @@ export const environment = { production: true, useHash: true, api: { - baseUrl: 'https://scm-api.eascs.com', + baseUrl: 'https://tms-api-test.eascs.com', refreshTokenEnabled: false, refreshTokenType: 'auth-refresh', }, diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 327f2f04..2a6fbc82 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -4,7 +4,7 @@ export const environment = { production: true, useHash: true, api: { - baseUrl: './', + baseUrl: 'https://tms-api-test.eascs.com', refreshTokenEnabled: true, refreshTokenType: 'auth-refresh' } From 305c15e4fae8e15ef6105dc9af847214d993fb60 Mon Sep 17 00:00:00 2001 From: Taric Xin Date: Wed, 8 Dec 2021 09:45:34 +0800 Subject: [PATCH 0055/1600] edit --- src/app/layout/pro/components/logo/logo.component.html | 2 +- src/assets/mocks/app-data.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/layout/pro/components/logo/logo.component.html b/src/app/layout/pro/components/logo/logo.component.html index c6891a91..511e16c7 100644 --- a/src/app/layout/pro/components/logo/logo.component.html +++ b/src/app/layout/pro/components/logo/logo.component.html @@ -1,4 +1,4 @@ - {{ name }} + {{ name }}

    {{ name }}

    diff --git a/src/assets/mocks/app-data.json b/src/assets/mocks/app-data.json index 110f30c5..49022dd9 100644 --- a/src/assets/mocks/app-data.json +++ b/src/assets/mocks/app-data.json @@ -1,6 +1,6 @@ { "app": { - "name": "SaaS管理后台", - "description": "新供应链 - SaaS管理后台" + "name": "运多星运营平台", + "description": "运多星运营平台" } } From 55811ba396e2ffb5728c003c39e927c10084e17e Mon Sep 17 00:00:00 2001 From: Taric Xin Date: Wed, 8 Dec 2021 09:49:30 +0800 Subject: [PATCH 0056/1600] edit --- src/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.html b/src/index.html index 813be1c5..7bea57c5 100644 --- a/src/index.html +++ b/src/index.html @@ -11,7 +11,7 @@ - Ng Alain Pro + 运多星运营平台 From a299e561812fd5746a14e835ab6711fa31c3390a Mon Sep 17 00:00:00 2001 From: wangshiming Date: Wed, 8 Dec 2021 14:21:05 +0800 Subject: [PATCH 0057/1600] =?UTF-8?q?=E5=90=88=E5=90=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assigned-car/assigned-car.component.html | 12 +- .../bulk-detail/bulk-detail.component.ts | 24 ++-- .../components/bulk/bulk.component.html | 14 ++- .../components/bulk/bulk.component.ts | 23 ++-- .../update-price/update-price.component.html | 12 +- .../update-price/update-price.component.ts | 8 ++ .../vehicle-detail.component.html | 96 ++++++++++------ .../vehicle-detail.component.ts | 27 ++++- .../components/vehicle/vehicle.component.html | 39 ++++--- .../components/vehicle/vehicle.component.ts | 105 ++++++++++-------- .../services/supply-management.service.ts | 18 ++- 11 files changed, 255 insertions(+), 123 deletions(-) diff --git a/src/app/routes/supply-management/components/assigned-car/assigned-car.component.html b/src/app/routes/supply-management/components/assigned-car/assigned-car.component.html index 3250285a..f15c5a54 100644 --- a/src/app/routes/supply-management/components/assigned-car/assigned-car.component.html +++ b/src/app/routes/supply-management/components/assigned-car/assigned-car.component.html @@ -1,7 +1,15 @@ +
    - - + +
    \ No newline at end of file diff --git a/src/app/routes/supply-management/components/bulk-detail/bulk-detail.component.ts b/src/app/routes/supply-management/components/bulk-detail/bulk-detail.component.ts index 9efd9693..93655fac 100644 --- a/src/app/routes/supply-management/components/bulk-detail/bulk-detail.component.ts +++ b/src/app/routes/supply-management/components/bulk-detail/bulk-detail.component.ts @@ -1,3 +1,11 @@ +/* + * @Author: your name + * @Date: 2021-12-03 11:10:14 + * @LastEditTime: 2021-12-07 19:51:21 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\supply-management\components\bulk-detail\bulk-detail.component.ts + */ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { STColumn } from '@delon/abc/st'; @@ -65,14 +73,14 @@ export class SupplyManagementBulkDetailComponent implements OnInit { nzTitle: '删除确认', nzContent: `请仔细核对,避免误操作!
    是否删除?
    `, nzOnOk: () => { - this.service.http.post(this.service.$api_del_driver, { id }).subscribe((res) => { - if (res) { - this.service.msgSrv.success('数据删除成功!'); - // this.st1.reload(); - } else { - this.service.msgSrv.error('删除失败!'); - } - }); + // this.service.http.post(this.service.$api_del_driver, { id }).subscribe((res) => { + // if (res) { + // this.service.msgSrv.success('数据删除成功!'); + // // this.st1.reload(); + // } else { + // this.service.msgSrv.error('删除失败!'); + // } + // }); }, }); } diff --git a/src/app/routes/supply-management/components/bulk/bulk.component.html b/src/app/routes/supply-management/components/bulk/bulk.component.html index 5beed3b3..270a45cd 100644 --- a/src/app/routes/supply-management/components/bulk/bulk.component.html +++ b/src/app/routes/supply-management/components/bulk/bulk.component.html @@ -49,7 +49,19 @@
    - + {{item.no}} diff --git a/src/app/routes/supply-management/components/bulk/bulk.component.ts b/src/app/routes/supply-management/components/bulk/bulk.component.ts index 8cd0ef88..db70fa62 100644 --- a/src/app/routes/supply-management/components/bulk/bulk.component.ts +++ b/src/app/routes/supply-management/components/bulk/bulk.component.ts @@ -53,7 +53,14 @@ export class SupplyManagementBulkComponent implements OnInit { this.initST(); this.initSFFre(); } - + /** + * 查询参数 + */ + get reqParams() { + return { + ...this.sf?.value, + }; + } /** * 初始化查询表单 */ @@ -315,13 +322,13 @@ export class SupplyManagementBulkComponent implements OnInit { getCatalogueMember() { const params = { }; - return this.service.request(this.service.$api_get_catalogue_member, params, 'GET').pipe( - map((res) => { - if (res) { - console.log(res) - } - }), - ); + // return this.service.request(this.service.$api_get_catalogue_member, params, 'GET').pipe( + // map((res) => { + // if (res) { + // console.log(res) + // } + // }), + // ); } selectChange(e: number) { diff --git a/src/app/routes/supply-management/components/update-price/update-price.component.html b/src/app/routes/supply-management/components/update-price/update-price.component.html index 9ca3db20..a4734c9f 100644 --- a/src/app/routes/supply-management/components/update-price/update-price.component.html +++ b/src/app/routes/supply-management/components/update-price/update-price.component.html @@ -1,3 +1,11 @@ +
    @@ -15,10 +23,10 @@

    变更日志

    - +
    \ No newline at end of file diff --git a/src/app/routes/supply-management/components/update-price/update-price.component.ts b/src/app/routes/supply-management/components/update-price/update-price.component.ts index 8e942bb0..30fbe169 100644 --- a/src/app/routes/supply-management/components/update-price/update-price.component.ts +++ b/src/app/routes/supply-management/components/update-price/update-price.component.ts @@ -1,3 +1,11 @@ +/* + * @Author: your name + * @Date: 2021-12-03 11:10:14 + * @LastEditTime: 2021-12-07 19:50:40 + * @LastEditors: your name + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\supply-management\components\update-price\update-price.component.ts + */ import { Component, OnInit, ViewChild } from '@angular/core'; import { STColumn } from '@delon/abc/st'; import { SFComponent, SFSchema, SFUISchema } from '@delon/form'; diff --git a/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.html b/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.html index 61cbd133..cddaeaea 100644 --- a/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.html +++ b/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.html @@ -6,12 +6,15 @@ -
    - {{ i?.no }} - 待接单 + {{ dataList?.resourceCode }} + + 待接单 + 已接单 + 已取消 +
    修改单价 @@ -24,64 +27,83 @@
    - +
    -
    - {{ i?.owner }} - 32943898021309809423 - 3321944288191034921 - 18112345678 - 曲丽丽 18100000000 - 曲丽丽 18100000000 +
    + {{ dataList?.enterpriseProjectId }} + {{ dataList?.externalResourceCode }} + {{ dataList?.enterpriseProjectId }} + {{ dataList?.dispatchName }}
    -

    装卸货信息

    -

    装货地:广东省深圳市龙岗区怡亚通大厦

    -

    联系人:奥利给/13680058545

    -

    卸货地:广东省深圳市福田区岗厦村9巷8号405(新村)

    -

    联系人:花花世界/13680058545

    -

    发货日期:广东省深圳市福田区岗厦村9巷8号405(新村)

    -

    卸货日期:花花世界/13680058545

    +
    +

    装卸货信息

    +
    +

    装货地:{{item?.detailedAddress}}

    +

    联系人:{{item?.appUserName}}/{{item?.contractTelephone}}

    +
    +
    +

    卸货地:{{item?.detailedAddress}}

    +

    联系人:{{item?.appUserName}}/{{item?.contractTelephone}}

    +
    +

    发货日期:{{item?.createTime}}

    +

    卸货日期:{{item?.modifyTime}}

    +
    -
    +
    -

    货物信息

    -

    货物名称:广东省深圳市龙岗区怡亚通大厦

    -

    重量/体积:广东省深圳市福田区岗厦村9巷8号405(新村)

    -

    车型/车长:花花世界/13680058545

    +
    +

    货物信息

    +

    货物名称:{{item?.goodsName}}

    +

    货物数量:{{item?.weight}}吨/{{item?.volume}}立方

    +

    用车需求:{{item?.vehicleDemand}}

    +
    -
    +
    -

    承运信息

    -

    司机:广东省深圳市龙岗区怡亚通大厦

    -

    车牌号:广东省深圳市福田区岗厦村9巷8号405(新村)

    -

    车型/车长/承重:{{'拖车'}} | {{'4.5米'}} | {{'15吨'}}

    +

    承运信息

    +

    网络货运人:{{dataList?.carrierInformationVO?.enterpriseInfoName}}

    +

    服务类型:{{dataList?.carrierInformationVO?.serviceType === 1 ? '抢单' : '指派'}}

    +

    司机姓名:{{dataList?.carrierInformationVO?.driverName}}

    +

    手机号:{{dataList?.carrierInformationVO?.driverTelephone}}

    +

    车牌号:{{dataList?.carrierInformationVO?.driverLicensePlate}}

    +
    +
    +
    +
    +

    服务信息

    +

    货物价值:{{dataList?.goodsInfoList?.goodsName}}

    +

    保价费金额:{{dataList?.goodsInfoList?.goodsName}}

    -

    补充信息

    -

    需要回单

    -

    备注:奥利给/13680058545

    +

    补充信息

    +

    {{dataList?.supplementaryInformationVO?.stateReceipt === 2 ? '不需要回单' : '需要回单'}}

    +

    联系人:{{dataList?.supplementaryInformationVO?.receiptUserId}}

    +

    联系电话:{{dataList?.supplementaryInformationVO?.remarks}}

    +

    所在地区:{{dataList?.supplementaryInformationVO?.remarks}}

    +

    详细地址:{{dataList?.supplementaryInformationVO?.receiptAddress}}

    +

    备注:{{dataList?.supplementaryInformationVO?.remarks}}

    -

    运费信息

    +

    运费信息

    -

    {{400 | currency }}

    -

    {{400 | currency }}

    -

    {{400 | currency }}

    -

    {{400 | currency}}

    -

    {{400 | currency }}

    +
    +

    {{'到货后15天内支付运费' }}

    +

    {{item.price | currency:'¥' }}

    +

    {{400 | currency:'¥' }}

    +
    diff --git a/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.ts b/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.ts index 0f719e6f..1bafd013 100644 --- a/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.ts +++ b/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.ts @@ -1,3 +1,11 @@ +/* + * @Author: your name + * @Date: 2021-12-03 11:10:14 + * @LastEditTime: 2021-12-08 10:21:11 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\supply-management\components\vehicle-detail\vehicle-detail.component.ts + */ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { STColumn } from '@delon/abc/st'; @@ -14,6 +22,7 @@ export class SupplyManagementVehicleDetailComponent implements OnInit { id = this.route.snapshot.params.id; i: any; + dataList: any; logColumns: STColumn[] = [ { title: '内容', index: 'theme' }, { title: '操作人', index: 'operationUserPhone' }, @@ -29,12 +38,22 @@ export class SupplyManagementVehicleDetailComponent implements OnInit { } ngOnInit(): void { - this.service.http.get(`/user/${this.id}?_allow_anonymous=true&_allow_badcode=true`).subscribe(res => { - console.log(res); - this.i = res - }); + console.log(this.id) + if(this.id) { + this.getDetailList(this.id) + } } + // 获取录单员 + getDetailList(id: any) { + const params = { + id: id + }; + this.service.request(`${this.service.$api_get_getCompleteVehicleDetail}`, params).subscribe((res) => { + console.log(res) + this.dataList = res + }) + } diff --git a/src/app/routes/supply-management/components/vehicle/vehicle.component.html b/src/app/routes/supply-management/components/vehicle/vehicle.component.html index f5f6aa17..9b6deaec 100644 --- a/src/app/routes/supply-management/components/vehicle/vehicle.component.html +++ b/src/app/routes/supply-management/components/vehicle/vehicle.component.html @@ -1,7 +1,7 @@
    - - - {{item.no}} + + + {{item.resourceCode}} - - + +
    + {{item?.LoadingAddressArr[i]}} +
    +
    + + 抢单 + 指派 + +
    {{item.no}}
    diff --git a/src/app/routes/supply-management/components/vehicle/vehicle.component.ts b/src/app/routes/supply-management/components/vehicle/vehicle.component.ts index 34243b32..26cb58f6 100644 --- a/src/app/routes/supply-management/components/vehicle/vehicle.component.ts +++ b/src/app/routes/supply-management/components/vehicle/vehicle.component.ts @@ -16,7 +16,6 @@ import { SupplyManagementUpdateFreightComponent } from '../update-freight/update styleUrls: ['./vehicle.component.less'] }) export class SupplyManagementVehicleComponent implements OnInit { - url = `/user?_allow_anonymous=true`; ui: SFUISchema = {}; ui2: SFUISchema = {}; schema: SFSchema = {}; @@ -30,32 +29,40 @@ export class SupplyManagementVehicleComponent implements OnInit { columns: STColumn[] = []; tabs = [ { name: '全部', - type: 5, + type: 0, count: 0, }, { name: '待接单', - type: 5, + type: 1, count: 0, }, { name: '已接单', - type: 5, + type: 2, count: 0, }, { name: '已取消', - type: 5, + type: 3, count: 0, }, ]; + resourceStatus: any; constructor(public service: SupplyManagementService, private modal: NzModalService, private router: Router,private ar: ActivatedRoute) { } /** * 查询参数 */ get reqParams() { + console.log(this.resourceStatus) + const a:any = {}; + if(this.resourceStatus) { + a.resourceStatus = this.resourceStatus + } + console.log(a) return { + ...a, ...this.sf?.value, }; } @@ -77,35 +84,35 @@ export class SupplyManagementVehicleComponent implements OnInit { this.schema = { properties: { _$expand: { type: 'boolean', ui: { hidden: true } }, - no: { + resourceCode: { type: 'string', title: '货源编号', }, - sex2: { + serviceType: { title: '服务类型', type: 'string', - default: 0, enum: [ - { label: '未知', value: 0 }, - { label: '男', value: 1 }, - { label: '女', value: 2 }, - { label: '保密', value: 3 }, + { label: '抢单', value: 1 }, + { label: '指派', value: 2 }, ], ui: { widget: 'select', } as SFSelectWidgetSchema, }, - categoryId: { + goodsName: { type: 'string', title: '货物名称', - // enum: this.secondCatList || [], + enum: [ + { label: '普货', value: 1 }, + { label: '指派', value: 2 }, + ], ui: { widget: 'select', placeholder: '请选择', } as SFSelectWidgetSchema, }, - no2: { + loadingPlace: { type: 'string', title: '装货地', ui: { @@ -135,12 +142,11 @@ export class SupplyManagementVehicleComponent implements OnInit { sex: { title: '审核状态', type: 'string', - default: 0, enum: [ - { label: '未知', value: 0 }, - { label: '男', value: 1 }, - { label: '女', value: 2 }, - { label: '保密', value: 3 }, + { label: '待审核', value: 1 }, + { label: '审核通过', value: 2 }, + { label: '不通过', value: 3 }, + { label: '已取消', value: 4 }, ], ui: { widget: 'select', @@ -159,7 +165,7 @@ export class SupplyManagementVehicleComponent implements OnInit { _$expand: (value: boolean) => value, }, allowClear: true, - asyncData: () => this.getCatalogueMember(), + // asyncData: () => this.getCatalogueMember(), }, }, }, @@ -193,26 +199,31 @@ export class SupplyManagementVehicleComponent implements OnInit { title: '货源编号', width: '100px', className: 'text-center', - render: 'goodsId' + render: 'resourceCode' }, - { title: '服务类型', index: 'externalSn', width: '120px', className: 'text-center' }, - { title: '货主', index: 'linkUrl', width: '120px', className: 'text-center' }, + { title: '服务类型', index: 'serviceType', width: '120px', className: 'text-center',render: 'serviceType'}, + { title: '货主', index: 'shipperAppUserName', width: '120px', className: 'text-center' }, { title: '项目名称', + index: 'enterpriseProjectName', className: 'text-center', width: '120px', }, { title: '装货地', + index: 'loadingAddressArr', className: 'text-center', width: '120px', + render: 'loadingAddressArr' }, { title: '卸货地', + index: 'unloadingAddressArr', className: 'text-center', width: '120px', }, { title: '货物名称', + index: 'goodsName', className: 'text-center', width: '120px', }, @@ -220,9 +231,12 @@ export class SupplyManagementVehicleComponent implements OnInit { title: '货物数量', className: 'text-center', width: '120px', + index: 'goodsNumber', + }, { title: '用车需求', + index: 'vehicleDemand', className: 'text-center', width: '120px', }, @@ -230,41 +244,43 @@ export class SupplyManagementVehicleComponent implements OnInit { title: '总费用', className: 'text-center', width: '120px', - index: 'goodsId', - render: 'enStatusStr27878' + index: 'totalAmount', + render: 'totalAmount' }, { title: '附加费', className: 'text-center', width: '120px', + index: 'surcharge', }, { title: '货源状态', className: 'text-center', - index: 'enStatusStr2', + index: 'resourceStatus', type: 'badge', width: '120px', badge: { - 正常: { text: '正常', color: 'success' }, - 冻结: { text: '冻结', color: 'warning' }, - 废弃: { text: '废弃', color: 'default' }, + 1: { text: '待接单', color: 'success' }, + 2: { text: '已接单', color: 'warning' }, }, }, { title: '创建时间', width: '170px', + index: 'releaseTime', className: 'text-center', }, { title: '审核状态', className: 'text-center', - index: 'enStatusStr3', + index: 'auditStatus', type: 'badge', width: '170px', badge: { - 正常: { text: '正常', color: 'success' }, - 冻结: { text: '冻结', color: 'warning' }, - 废弃: { text: '废弃', color: 'default' }, + 1: { text: '待审核', color: 'warning' }, + 2: { text: '审核通过', color: 'success' }, + 3: { text: '不通过', color: 'default' }, + 4: { text: '已取消', color: 'default' }, }, }, { @@ -276,10 +292,12 @@ export class SupplyManagementVehicleComponent implements OnInit { { text: '货源审核', click: (_record) => this.audit(_record, 1), + iif: item => item.status === 1, }, { text: '修改货源', click: (_record) => this.amend(_record), + iif: item => item.status === 1 || item.status === 2, }, { text: '修改运费', @@ -287,6 +305,7 @@ export class SupplyManagementVehicleComponent implements OnInit { }, { text: '取消货源', + iif: item => item.status === 1 || item.status === 2, // click: (_record) => this.delOne(_record), }, { @@ -296,6 +315,7 @@ export class SupplyManagementVehicleComponent implements OnInit { { text: '重新指派', click: (_record) => this.assignedCar(_record), + iif: item => item.status === 2, }, ], }, @@ -332,21 +352,14 @@ export class SupplyManagementVehicleComponent implements OnInit { - // 获取录单员 - getCatalogueMember() { - const params = { - }; - return this.service.request(this.service.$api_get_catalogue_member, params, 'GET').pipe( - map((res) => { - if (res) { - console.log(res) - } - }), - ); - } selectChange(e: number) { console.log(e); + this.resourceStatus = e; + this.initST(); + setTimeout(() => { + this.st.load(); + }, 500); } /** diff --git a/src/app/routes/supply-management/services/supply-management.service.ts b/src/app/routes/supply-management/services/supply-management.service.ts index 80882fb7..56310ac2 100644 --- a/src/app/routes/supply-management/services/supply-management.service.ts +++ b/src/app/routes/supply-management/services/supply-management.service.ts @@ -1,3 +1,11 @@ +/* + * @Author: your name + * @Date: 2021-12-03 11:10:14 + * @LastEditTime: 2021-12-07 20:09:14 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: \tms-obc-web\src\app\routes\supply-management\services\supply-management.service.ts + */ import { Injectable, Injector } from '@angular/core'; import { BaseService } from 'src/app/shared/services'; @@ -5,9 +13,15 @@ import { BaseService } from 'src/app/shared/services'; providedIn: 'root' }) export class SupplyManagementService extends BaseService { + // 整车获取货源表详情 + $api_get_getCompleteVehicleDetail = `api/sdc/goodsResourceOperate/getCompleteVehicleDetail`; + // 大宗获取货源表详情 + $api_get_getBulkDetail = `api/sdc/goodsResourceOperate/getBulkDetail`; + // 查询运营后台大宗货源列表 + $api_get_bulkPage_list = `api/sdc/goodsResourceOperate/list/bulkPage`; + // 查询运营后台整车货源列表 + $api_get_wholePage_list = `api/sdc/goodsResourceOperate/list/wholePage`; - $api_get_catalogue_member = `/user?_allow_anonymous=true`; - $api_del_driver = ``; constructor(public injector: Injector) { super(injector) } From a6b9c6b07fa0b475c0fd6a9cc7f506aca245eecb Mon Sep 17 00:00:00 2001 From: wangshiming Date: Wed, 8 Dec 2021 15:40:46 +0800 Subject: [PATCH 0058/1600] =?UTF-8?q?=E5=90=88=E5=90=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../onecar-publish.component.html | 24 ++++------- .../onecar-publish.component.ts | 40 +++++++++++-------- .../vehicle-detail.component.html | 25 ++++++------ .../vehicle-detail.component.ts | 18 +++++++-- .../components/vehicle/vehicle.component.ts | 23 ++++++----- .../shared/services/business/user.service.ts | 8 ++-- 6 files changed, 78 insertions(+), 60 deletions(-) diff --git a/src/app/routes/supply-management/components/onecar-publish/onecar-publish.component.html b/src/app/routes/supply-management/components/onecar-publish/onecar-publish.component.html index 4e1a0563..aabfef99 100644 --- a/src/app/routes/supply-management/components/onecar-publish/onecar-publish.component.html +++ b/src/app/routes/supply-management/components/onecar-publish/onecar-publish.component.html @@ -1,25 +1,17 @@ - + + + + +
    货源单设置
    - +
    装卸货信息预计公里数:-km,预计行程耗时:-小时
    -
    diff --git a/src/app/routes/supply-management/components/onecar-publish/onecar-publish.component.ts b/src/app/routes/supply-management/components/onecar-publish/onecar-publish.component.ts index cdbe5362..240ebd5b 100644 --- a/src/app/routes/supply-management/components/onecar-publish/onecar-publish.component.ts +++ b/src/app/routes/supply-management/components/onecar-publish/onecar-publish.component.ts @@ -1,8 +1,7 @@ import { Component, OnInit, ViewChild } from '@angular/core'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { Router } from '@angular/router'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; import { - SFArrayWidgetSchema, SFComponent, SFNumberWidgetSchema, SFSchema, @@ -12,10 +11,9 @@ import { } from '@delon/form'; import { _HttpClient } from '@delon/theme'; import { AmapPoiPickerComponent } from '@shared'; -import { NzModalRef, NzModalService } from 'ng-zorro-antd/modal'; - +import { NzModalService } from 'ng-zorro-antd/modal'; import { PublishGoodsChooseFamifiarComponent } from '../choose-famifiar/choose-famifiar.component'; -import { GaodeMapComponent } from '../gaode-map/gaode-map.component'; +import { SupplyManagementService } from '../../services/supply-management.service'; @Component({ selector: 'app-publish-goods-onecar-publish', templateUrl: './onecar-publish.component.html', @@ -24,7 +22,7 @@ import { GaodeMapComponent } from '../gaode-map/gaode-map.component'; export class SupplyManagementOnecarPublishComponent implements OnInit { validateForm1: FormGroup; newTempchecked = false; //是否存入新模板 - + id = this.route.snapshot.params.id; // // 单位 unit1 = '吨'; unit2 = '方'; @@ -43,10 +41,8 @@ export class SupplyManagementOnecarPublishComponent implements OnInit { phone: '18888888888' } ]; - - // formatterRmb = (value: number): string => `¥ ${value}`; - // parserRmb = (value: string): string => value.replace('¥ ', ''); - constructor(private http: _HttpClient, fb: FormBuilder, private router: Router, private modalService: NzModalService) { + dataList: any; + constructor(private http: _HttpClient, fb: FormBuilder, private router: Router, private route: ActivatedRoute, private modalService: NzModalService, public service: SupplyManagementService) { this.validateForm1 = fb.group({ name1: [null, []], name2: [null, []], @@ -89,12 +85,13 @@ export class SupplyManagementOnecarPublishComponent implements OnInit { this.initSF5(); this.initSF6(); this.initSF7(); + this.initdata(); } initSF1() { this.schema1 = { properties: { - name3: { + shipperAdispatchNameppUserNmae: { type: 'string', title: '货主', maxLength: 30, @@ -102,7 +99,7 @@ export class SupplyManagementOnecarPublishComponent implements OnInit { placeholder: '请输入' } }, - name4: { + enterpriseProjectName: { type: 'string', title: '项目', enum: [ @@ -124,7 +121,7 @@ export class SupplyManagementOnecarPublishComponent implements OnInit { // change: (i) => this.updateCategory(i, '/categoryId2'), } as SFSelectWidgetSchema }, - no1: { + enterpriseInfoName: { type: 'string', title: '网络货运人', ui: { @@ -132,7 +129,7 @@ export class SupplyManagementOnecarPublishComponent implements OnInit { }, default: 0 }, - name8: { + externalResourceCode: { type: 'string', title: '外部货源号', maxLength: 30, @@ -140,7 +137,7 @@ export class SupplyManagementOnecarPublishComponent implements OnInit { placeholder: '请输入' } }, - name2: { + dispatchName: { type: 'string', title: '调度员', enum: [ @@ -494,4 +491,15 @@ export class SupplyManagementOnecarPublishComponent implements OnInit { nzWidth: 848 }); } + goBack() { + window.history.go(-1); + } + // 初始化信息 + initdata() { + console.log(this.id) + this.service.request(`${this.service.$api_get_getCompleteVehicleDetail}`, {id:this.id}).subscribe((res) => { + console.log(res) + this.dataList = res; + }) + } } diff --git a/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.html b/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.html index cddaeaea..7c78877e 100644 --- a/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.html +++ b/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.html @@ -7,19 +7,19 @@
    -
    +
    {{ dataList?.resourceCode }} - 待接单 - 已接单 - 已取消 + 待接单 + 已接单 + 已取消 @@ -99,17 +99,18 @@

    运费信息

    -
    -

    {{'到货后15天内支付运费' }}

    -

    {{item.price | currency:'¥' }}

    -

    {{400 | currency:'¥' }}

    -
    +

    预付:{{dataList?.expenseList?.prePay | currency: '¥' }}

    +

    油卡:{{dataList?.expenseList?.oilCardPay | currency: '¥'}}

    +

    到付:{{dataList?.expenseList?.toPay | currency: '¥'}}

    +

    回单付:{{dataList?.expenseList?.receiptPay | currency: '¥'}}

    +

    保险费:{{dataList?.expenseList?.insuranceFee | currency: '¥'}}

    +

    附加费保险费:{{dataList?.expenseList?.appendFee | currency: '¥'}}

    -

    {{400 | currency }}

    +

    {{dataList?.expenseList?.totalFee | currency: '¥' }}

    diff --git a/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.ts b/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.ts index 1bafd013..c6d5ef16 100644 --- a/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.ts +++ b/src/app/routes/supply-management/components/vehicle-detail/vehicle-detail.component.ts @@ -1,13 +1,13 @@ /* * @Author: your name * @Date: 2021-12-03 11:10:14 - * @LastEditTime: 2021-12-08 10:21:11 + * @LastEditTime: 2021-12-08 14:35:47 * @LastEditors: Please set LastEditors * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: \tms-obc-web\src\app\routes\supply-management\components\vehicle-detail\vehicle-detail.component.ts */ import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, Router } from '@angular/router'; import { STColumn } from '@delon/abc/st'; import { _HttpClient } from '@delon/theme'; import { NzMessageService } from 'ng-zorro-antd/message'; @@ -33,6 +33,7 @@ export class SupplyManagementVehicleDetailComponent implements OnInit { private route: ActivatedRoute, private msgSrv: NzMessageService, private service: SupplyManagementService, + private router: Router,private ar: ActivatedRoute ) { } @@ -54,7 +55,18 @@ export class SupplyManagementVehicleDetailComponent implements OnInit { this.dataList = res }) } - + // 修改货源 + modification() { + this.router.navigate(['/supply-management/vehicle-amend', this.id], { + relativeTo: this.ar + }) + } + // 再下一单 + nextOrder() { + this.router.navigate(['/supply-management/vehicle-amend', this.id], { + relativeTo: this.ar + }) + } diff --git a/src/app/routes/supply-management/components/vehicle/vehicle.component.ts b/src/app/routes/supply-management/components/vehicle/vehicle.component.ts index 26cb58f6..587a4c71 100644 --- a/src/app/routes/supply-management/components/vehicle/vehicle.component.ts +++ b/src/app/routes/supply-management/components/vehicle/vehicle.component.ts @@ -121,7 +121,7 @@ export class SupplyManagementVehicleComponent implements OnInit { }, } }, - no1: { + dischargePlace: { type: 'string', title: '卸货地', ui: { @@ -130,7 +130,7 @@ export class SupplyManagementVehicleComponent implements OnInit { }, } }, - no4: { + shipperAppUserName: { type: 'string', title: '货主', ui: { @@ -139,7 +139,7 @@ export class SupplyManagementVehicleComponent implements OnInit { }, } }, - sex: { + auditStatus: { title: '审核状态', type: 'string', enum: [ @@ -155,7 +155,7 @@ export class SupplyManagementVehicleComponent implements OnInit { }, } as SFSelectWidgetSchema, }, - appId: { + enterpriseInfoName: { type: 'string', title: '网络货运人', ui: { @@ -292,12 +292,12 @@ export class SupplyManagementVehicleComponent implements OnInit { { text: '货源审核', click: (_record) => this.audit(_record, 1), - iif: item => item.status === 1, + // iif: item => item.auditStatus === 1, }, { text: '修改货源', click: (_record) => this.amend(_record), - iif: item => item.status === 1 || item.status === 2, + // iif: item => item.auditStatus === 1 || item.auditStatus === 2, }, { text: '修改运费', @@ -305,17 +305,17 @@ export class SupplyManagementVehicleComponent implements OnInit { }, { text: '取消货源', - iif: item => item.status === 1 || item.status === 2, + // iif: item => item.auditStatus === 1 || item.auditStatus === 2, // click: (_record) => this.delOne(_record), }, { text: '再下一单', - // click: (_record) => this.editOne(_record), + click: (_record) => this.nextOrder(_record), }, { text: '重新指派', click: (_record) => this.assignedCar(_record), - iif: item => item.status === 2, + // iif: item => item.auditStatus === 2, }, ], }, @@ -448,4 +448,9 @@ export class SupplyManagementVehicleComponent implements OnInit { relativeTo: this.ar }) } + nextOrder(item: any) { + this.router.navigate(['/supply-management/vehicle-amend', item.id], { + relativeTo: this.ar + }) + } } diff --git a/src/app/shared/services/business/user.service.ts b/src/app/shared/services/business/user.service.ts index 0fee00cb..21e7cf7a 100644 --- a/src/app/shared/services/business/user.service.ts +++ b/src/app/shared/services/business/user.service.ts @@ -2,8 +2,8 @@ * @Description: * @Author: wsm * @Date: 2021-06-22 10:25:33 - * @LastEditTime: 2021-06-23 20:25:05 - * @LastEditors: Do not edit + * @LastEditTime: 2021-12-08 15:40:21 + * @LastEditors: Please set LastEditors * @Reference: */ import { Inject, Injectable, Injector } from '@angular/core'; @@ -25,11 +25,11 @@ export class EAUserService extends BaseService { /** * 账号密码登录 */ - $api_login_by_account = `/api/mdc/cuc/user/login?_allow_anonymous=true`; + $api_login_by_account = `api/mdc/cuc/user/login?_allow_anonymous=true`; /** * 手机号登录 */ - $api_login_by_mobile = `/api/mdc/cuc/user/sms/login?_allow_anonymous=true`; + $api_login_by_mobile = `api/mdc/cuc/user/sms/login?_allow_anonymous=true`; // 登录路径 private $api_login = `/scce/cuc/cuc/user/login?_allow_anonymous=true`; private $api_captcha_login = `/scce/cuc/cuc/user/sms/login?_allow_anonymous=true`; From c369d4241463e7efcf6b5dc9c7499b08bdbba040 Mon Sep 17 00:00:00 2001 From: Taric Xin Date: Wed, 8 Dec 2021 15:56:22 +0800 Subject: [PATCH 0059/1600] edit --- .../invoice-requested-detail.component.ts | 1 + .../driver/detail/detail.component.ts | 4 +- .../enterprise-audit/view/view.component.ts | 4 +- .../freight/list/detail/detail.component.html | 467 +++++++----------- .../freight/list/detail/detail.component.less | 1 - .../freight/list/detail/detail.component.ts | 169 ++----- .../freight/list/list.component.html | 68 +-- .../freight/list/list.component.less | 0 .../freight/list/list.component.spec.ts | 23 - .../components/freight/list/list.component.ts | 178 +++---- .../freight/list/view/view.component.ts | 6 +- .../freight/user/detail/detail.component.ts | 6 +- .../usercenter/services/usercenter.service.ts | 73 +-- 13 files changed, 337 insertions(+), 663 deletions(-) create mode 100644 src/app/routes/usercenter/components/freight/list/list.component.less delete mode 100644 src/app/routes/usercenter/components/freight/list/list.component.spec.ts diff --git a/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.ts b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.ts index b04d7e0c..103f5015 100644 --- a/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.ts +++ b/src/app/routes/ticket-management/components/invoice-requested/invoice-requested-detail/invoice-requested-detail.component.ts @@ -62,6 +62,7 @@ export class InvoiceRequestedDetailComponent implements OnInit { type: 'string', title: '发票号码', ui: { + placeholder: '请输入', autocomplete: 'off' } } diff --git a/src/app/routes/usercenter/components/driver/detail/detail.component.ts b/src/app/routes/usercenter/components/driver/detail/detail.component.ts index 400db1e1..b70efcb7 100644 --- a/src/app/routes/usercenter/components/driver/detail/detail.component.ts +++ b/src/app/routes/usercenter/components/driver/detail/detail.component.ts @@ -114,7 +114,7 @@ export class UserCenterComponentsDriverDetailComponent implements OnInit { tenantId: this.route.snapshot.params.id, // tenantId: this.route.snapshot.queryParams.tenantId, }; - const res = await this.service.asyncRequest(this.service.$api_get_supplier_info, params); + const res = await this.service.asyncRequest(this.service.$api_get_one, params); // // 商品资质 // if (res.enterpriseBusinessJson) { // res.enterpriseBusinessJson.aptitudes = res.enterpriseBusinessJson?.aptitudes ? res.enterpriseBusinessJson.aptitudes.split(',') : []; @@ -154,7 +154,7 @@ export class UserCenterComponentsDriverDetailComponent implements OnInit { const params = { regionCode: code, }; - const res = await this.service.asyncRequest(this.service.$api_get_region_detailByCode, params, 'POST', true); + const res = await this.service.asyncRequest(this.service.$api_get_one, params, 'POST', true); // if (res && res.regionFullName) { // const arr = res.regionFullName.split(','); // res.regionFullName = arr.reverse().join('-'); diff --git a/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.ts b/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.ts index 46db87ab..dd77b304 100644 --- a/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.ts +++ b/src/app/routes/usercenter/components/freight/enterprise-audit/view/view.component.ts @@ -110,7 +110,7 @@ export class FreightComponentsEnterpriseAuditViewComponent implements OnInit { tenantId: this.route.snapshot.params.id, // tenantId: this.route.snapshot.queryParams.tenantId, }; - const res = await this.service.asyncRequest(this.service.$api_get_supplier_info, params); + const res = await this.service.asyncRequest(this.service.$api_get_one, params); // // 商品资质 // if (res.enterpriseBusinessJson) { // res.enterpriseBusinessJson.aptitudes = res.enterpriseBusinessJson?.aptitudes ? res.enterpriseBusinessJson.aptitudes.split(',') : []; @@ -150,7 +150,7 @@ export class FreightComponentsEnterpriseAuditViewComponent implements OnInit { const params = { regionCode: code, }; - const res = await this.service.asyncRequest(this.service.$api_get_region_detailByCode, params, 'POST', true); + const res = await this.service.asyncRequest(this.service.$api_get_one, params, 'POST', true); // if (res && res.regionFullName) { // const arr = res.regionFullName.split(','); // res.regionFullName = arr.reverse().join('-'); diff --git a/src/app/routes/usercenter/components/freight/list/detail/detail.component.html b/src/app/routes/usercenter/components/freight/list/detail/detail.component.html index 4aafe892..8d08b3f9 100644 --- a/src/app/routes/usercenter/components/freight/list/detail/detail.component.html +++ b/src/app/routes/usercenter/components/freight/list/detail/detail.component.html @@ -1,289 +1,202 @@ - - - - - - - -