├── .forceignore ├── .gitignore ├── .sfdx ├── orgs │ └── fhuot@fr.edenred.com.recette │ │ └── metadataTypeInfos.json └── typings │ └── lwc │ ├── apex.d.ts │ ├── engine.d.ts │ ├── lds.d.ts │ ├── schema.d.ts │ └── user.d.ts ├── .vscode └── settings.json ├── README.md ├── assets ├── Record page.png └── Widget.png ├── config ├── project-scratch-def.json └── user-def.json ├── data ├── Knowledge-export-query └── Knowledge__kav.json ├── force-app └── main │ └── default │ ├── appMenus │ └── AppSwitcher.appMenu-meta.xml │ ├── applications │ └── Knowledge_Search_App.app-meta.xml │ ├── classes │ ├── knowledgeSearchController.cls │ └── knowledgeSearchController.cls-meta.xml │ ├── contentassets │ ├── iconfinder_handdrawngraduationcap_3.asset │ └── iconfinder_handdrawngraduationcap_3.asset-meta.xml │ ├── flexipages │ ├── Case_Record_Page.flexipage-meta.xml │ └── Knowledge_Search_App_UtilityBar.flexipage-meta.xml │ ├── layouts │ └── Knowledge__kav-Knowledge Layout.layout-meta.xml │ ├── lwc │ ├── .eslintrc.json │ ├── jsconfig.json │ └── knowledgeSearch │ │ ├── knowledgeSearch.css │ │ ├── knowledgeSearch.html │ │ ├── knowledgeSearch.js │ │ ├── knowledgeSearch.js-meta.xml │ │ └── knowledgeSearch.svg │ ├── objects │ ├── Case │ │ ├── Case.object-meta.xml │ │ └── fields │ │ │ ├── AccountId.field-meta.xml │ │ │ ├── AssetId.field-meta.xml │ │ │ ├── BusinessHoursId.field-meta.xml │ │ │ ├── ClosedDate.field-meta.xml │ │ │ ├── Comments.field-meta.xml │ │ │ ├── ContactEmail.field-meta.xml │ │ │ ├── ContactFax.field-meta.xml │ │ │ ├── ContactId.field-meta.xml │ │ │ ├── ContactMobile.field-meta.xml │ │ │ ├── ContactPhone.field-meta.xml │ │ │ ├── Description.field-meta.xml │ │ │ ├── IsClosedOnCreate.field-meta.xml │ │ │ ├── IsEscalated.field-meta.xml │ │ │ ├── Origin.field-meta.xml │ │ │ ├── OwnerId.field-meta.xml │ │ │ ├── ParentId.field-meta.xml │ │ │ ├── Priority.field-meta.xml │ │ │ ├── Reason.field-meta.xml │ │ │ ├── Status.field-meta.xml │ │ │ ├── Subject.field-meta.xml │ │ │ ├── SuppliedCompany.field-meta.xml │ │ │ ├── SuppliedEmail.field-meta.xml │ │ │ ├── SuppliedName.field-meta.xml │ │ │ ├── SuppliedPhone.field-meta.xml │ │ │ └── Type.field-meta.xml │ └── Knowledge__kav │ │ └── recordTypes │ │ ├── QA_Salesforce.recordType-meta.xml │ │ └── QA_Trailhead.recordType-meta.xml │ ├── permissionsets │ ├── KnowledgeAppUser.permissionset-meta.xml │ └── KnowledgeUser.permissionset-meta.xml │ ├── profiles │ ├── Admin.profile-meta.xml │ ├── Custom%3A Marketing Profile.profile-meta.xml │ ├── Custom%3A Sales Profile.profile-meta.xml │ └── Custom%3A Support Profile.profile-meta.xml │ └── settings │ └── Security.settings-meta.xml ├── manifest └── package.xml ├── setupScratchOrg.cmd └── sfdx-project.json /.forceignore: -------------------------------------------------------------------------------- 1 | # List files or directories below to ignore them when running force:source:push, force:source:pull, and force:source:status 2 | # More information: https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_exclude_source.htm 3 | # 4 | 5 | package.xml 6 | 7 | # LWC configuration files 8 | **/jsconfig.json 9 | **/.eslintrc.json 10 | 11 | # LWC Jest 12 | **/__tests__/** -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .sfdx 2 | .vscode 3 | .DS_Store 4 | local 5 | node_modules -------------------------------------------------------------------------------- /.sfdx/typings/lwc/apex.d.ts: -------------------------------------------------------------------------------- 1 | declare module "@salesforce/apex" { 2 | /** 3 | * Identifier for an object's field. 4 | */ 5 | export interface FieldId { 6 | /** The field's API name. */ 7 | fieldApiName: string; 8 | /** The object's API name. */ 9 | objectApiName: string; 10 | } 11 | 12 | /** 13 | * Services for Apex. 14 | */ 15 | export interface ApexServices { 16 | /** 17 | * Refreshes a property annotated with @wire. Queries the server for updated data and refreshes the cache. 18 | * @param wiredTargetValue A property annotated with @wire. 19 | * @returns Promise that resolves to the refreshed value. If an error occurs, the promise is rejected. 20 | */ 21 | refreshApex: (wiredTargetValue: any) => Promise; 22 | 23 | /** 24 | * Gets a field value from an Apex sObject. 25 | * @param sObject The sObject holding the field. 26 | * @param field The field to return. 27 | * @returns The field's value. If it doesn't exist, undefined is returned. 28 | */ 29 | getSObjectValue: (sObject: object, field: string | FieldId) => any; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /.sfdx/typings/lwc/engine.d.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018, salesforce.com, inc. 3 | * All rights reserved. 4 | * SPDX-License-Identifier: MIT 5 | * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT 6 | */ 7 | /** 8 | * Lightning Web Components core module 9 | */ 10 | declare module 'lwc' { 11 | 12 | interface ComposableEvent extends Event { 13 | composed: boolean 14 | } 15 | 16 | class HTMLElementTheGoodPart { 17 | dispatchEvent(evt: ComposableEvent): boolean; 18 | addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; 19 | removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void; 20 | getAttribute(name: string): string | null; 21 | getBoundingClientRect(): ClientRect; 22 | querySelector(selectors: string): HTMLElement | null 23 | querySelectorAll(selectors: string): NodeListOf 24 | readonly tagName: string 25 | readonly classList: DOMTokenList; 26 | 27 | // Default HTML Properties 28 | dir: string; 29 | id: string; 30 | accessKey: string; 31 | title: string; 32 | lang: string; 33 | hidden: boolean; 34 | draggable: boolean; 35 | tabIndex: number; 36 | 37 | // Aria Properties 38 | ariaAutoComplete: string | null; 39 | ariaChecked: string | null; 40 | ariaCurrent: string | null; 41 | ariaDisabled: string | null; 42 | ariaExpanded: string | null; 43 | ariaHasPopUp: string | null; 44 | ariaHidden: string | null; 45 | ariaInvalid: string | null; 46 | ariaLabel: string | null; 47 | ariaLevel: string | null; 48 | ariaMultiLine: string | null; 49 | ariaMultiSelectable: string | null; 50 | ariaOrientation: string | null; 51 | ariaPressed: string | null; 52 | ariaReadOnly: string | null; 53 | ariaRequired: string | null; 54 | ariaSelected: string | null; 55 | ariaSort: string | null; 56 | ariaValueMax: string | null; 57 | ariaValueMin: string | null; 58 | ariaValueNow: string | null; 59 | ariaValueText: string | null; 60 | ariaLive: string | null; 61 | ariaRelevant: string | null; 62 | ariaAtomic: string | null; 63 | ariaBusy: string | null; 64 | ariaActiveDescendant: string | null; 65 | ariaControls: string | null; 66 | ariaDescribedBy: string | null; 67 | ariaFlowTo: string | null; 68 | ariaLabelledBy: string | null; 69 | ariaOwns: string | null; 70 | ariaPosInSet: string | null; 71 | ariaSetSize: string | null; 72 | ariaColCount: string | null; 73 | ariaColIndex: string | null; 74 | ariaDetails: string | null; 75 | ariaErrorMessage: string | null; 76 | ariaKeyShortcuts: string | null; 77 | ariaModal: string | null; 78 | ariaPlaceholder: string | null; 79 | ariaRoleDescription: string | null; 80 | ariaRowCount: string | null; 81 | ariaRowIndex: string | null; 82 | ariaRowSpan: string | null; 83 | role: string | null; 84 | } 85 | 86 | interface ShadowRootTheGoodPart extends NodeSelector { 87 | mode: string; 88 | readonly host: null; 89 | readonly firstChild: Node | null, 90 | readonly lastChild: Node | null, 91 | readonly innerHTML: string, 92 | readonly textContent: string, 93 | readonly childNodes: Node[], 94 | readonly delegatesFocus: boolean, 95 | addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; 96 | removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void; 97 | hasChildNodes(): boolean; 98 | compareDocumentPosition(otherNode: Node): number; 99 | contains(otherNode: Node): boolean; 100 | 101 | // Aria Properties 102 | ariaAutoComplete: string | null; 103 | ariaChecked: string | null; 104 | ariaCurrent: string | null; 105 | ariaDisabled: string | null; 106 | ariaExpanded: string | null; 107 | ariaHasPopUp: string | null; 108 | ariaHidden: string | null; 109 | ariaInvalid: string | null; 110 | ariaLabel: string | null; 111 | ariaLevel: string | null; 112 | ariaMultiLine: string | null; 113 | ariaMultiSelectable: string | null; 114 | ariaOrientation: string | null; 115 | ariaPressed: string | null; 116 | ariaReadOnly: string | null; 117 | ariaRequired: string | null; 118 | ariaSelected: string | null; 119 | ariaSort: string | null; 120 | ariaValueMax: string | null; 121 | ariaValueMin: string | null; 122 | ariaValueNow: string | null; 123 | ariaValueText: string | null; 124 | ariaLive: string | null; 125 | ariaRelevant: string | null; 126 | ariaAtomic: string | null; 127 | ariaBusy: string | null; 128 | ariaActiveDescendant: string | null; 129 | ariaControls: string | null; 130 | ariaDescribedBy: string | null; 131 | ariaFlowTo: string | null; 132 | ariaLabelledBy: string | null; 133 | ariaOwns: string | null; 134 | ariaPosInSet: string | null; 135 | ariaSetSize: string | null; 136 | ariaColCount: string | null; 137 | ariaColIndex: string | null; 138 | ariaDetails: string | null; 139 | ariaErrorMessage: string | null; 140 | ariaKeyShortcuts: string | null; 141 | ariaModal: string | null; 142 | ariaPlaceholder: string | null; 143 | ariaRoleDescription: string | null; 144 | ariaRowCount: string | null; 145 | ariaRowIndex: string | null; 146 | ariaRowSpan: string | null; 147 | role: string | null; 148 | } 149 | 150 | /** 151 | * Base class for the Lightning Web Component JavaScript class 152 | */ 153 | export class LightningElement extends HTMLElementTheGoodPart { 154 | /** 155 | * Called when the component is created 156 | */ 157 | constructor(); 158 | /** 159 | * Called when the element is inserted in a document 160 | */ 161 | connectedCallback(): void; 162 | /** 163 | * Called when the element is removed from a document 164 | */ 165 | disconnectedCallback(): void; 166 | /** 167 | * Called after every render of the component 168 | */ 169 | renderedCallback(): void; 170 | /** 171 | * Called when a descendant component throws an error in one of its lifecycle hooks 172 | */ 173 | errorCallback(error: any, stack: string): void; 174 | 175 | readonly template: ShadowRootTheGoodPart; 176 | readonly shadowRoot: null; 177 | } 178 | 179 | /** 180 | * Decorator to mark public reactive properties 181 | */ 182 | export const api: PropertyDecorator; 183 | 184 | /** 185 | * Decorator to mark private reactive properties 186 | */ 187 | export const track: PropertyDecorator; 188 | 189 | /** 190 | * Decorator factory to wire a property or method to a wire adapter data source 191 | * @param getType imperative accessor for the data source 192 | * @param config configuration object for the accessor 193 | */ 194 | export function wire(getType: (config?: any) => any, config?: any): PropertyDecorator; 195 | } 196 | -------------------------------------------------------------------------------- /.sfdx/typings/lwc/lds.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'lightning/uiListApi' { 2 | /** 3 | * Identifier for an object. 4 | */ 5 | export interface ObjectId { 6 | /** The object's API name. */ 7 | objectApiName: string; 8 | } 9 | 10 | /** 11 | * Identifier for an object's field. 12 | */ 13 | export interface FieldId { 14 | /** The field's API name. */ 15 | fieldApiName: string; 16 | /** The object's API name. */ 17 | objectApiName: string; 18 | } 19 | 20 | /** 21 | * Wire adapter for list view records and metadata. 22 | * 23 | * https://developer.salesforce.com/docs/atlas.en-us.uiapi.meta/uiapi/ui_api_resources_list_views_records_md.htm 24 | * 25 | * @param objectApiName API name of the list view's object (must be specified along with listViewApiName). 26 | * @param listViewApiName API name of the list view (must be specified with objectApiName). 27 | * @param listViewId ID of the list view (may be specified without objectApiName or listViewApiName). 28 | * @param pageToken Page ID of records to retrieve. 29 | * @param pageSize Number of records to retrieve at once. The default value is 50. Value can be 1–2000. 30 | * @param sortBy Object-qualified field API name on which to sort. 31 | * @param fields Object-qualified field API names to retrieve. These fields don’t create visible columns. 32 | * If a field isn’t accessible to the context user, it causes an error. 33 | * @param optionalFields Object-qualified field API names to retrieve. These fields don’t create visible columns. 34 | * If an optional field isn’t accessible to the context user, it isn’t included in the response, but it doesn’t cause an error. 35 | * @param q Query string to filter list views (only for a list of lists). 36 | * @returns {Observable} See description. 37 | */ 38 | export function getListUi( 39 | objectApiName?: string | ObjectId, 40 | listViewApiName?: string | symbol, 41 | listViewId?: string, 42 | pageToken?: string, 43 | pageSize?: number, 44 | sortBy?: string | FieldId, 45 | fields?: Array, 46 | optionalFields?: Array, 47 | q?: string, 48 | ): void; 49 | } 50 | 51 | declare module 'lightning/uiObjectInfoApi' { 52 | /** 53 | * Identifier for an object. 54 | */ 55 | export interface ObjectId { 56 | /** The object's API name. */ 57 | objectApiName: string; 58 | } 59 | 60 | /** 61 | * Identifier for an object's field. 62 | */ 63 | export interface FieldId { 64 | /** The field's API name. */ 65 | fieldApiName: string; 66 | /** The object's API name. */ 67 | objectApiName: string; 68 | } 69 | 70 | /** 71 | * Wire adapter for object metadata. 72 | * 73 | * https://developer.salesforce.com/docs/atlas.en-us.uiapi.meta/uiapi/ui_api_resources_object_info.htm 74 | * 75 | * @param objectApiName The API name of the object to retrieve. 76 | */ 77 | export function getObjectInfo(objectApiName: string | ObjectId): void; 78 | 79 | /** 80 | * Wire adapter for values for a picklist field. 81 | * 82 | * https://developer.salesforce.com/docs/atlas.en-us.uiapi.meta/uiapi/ui_api_resources_picklist_values.htm 83 | * 84 | * @param fieldApiName The picklist field's object-qualified API name. 85 | * @param recordTypeId The record type ID. Pass '012000000000000AAA' for the master record type. 86 | */ 87 | export function getPicklistValues(fieldApiName: string | FieldId, recordTypeId: string): void; 88 | 89 | /** 90 | * Wire adapter for values for all picklist fields of a record type. 91 | * 92 | * https://developer.salesforce.com/docs/atlas.en-us.uiapi.meta/uiapi/ui_api_resources_picklist_values_collection.htm 93 | * 94 | * @param objectApiName API name of the object. 95 | * @param recordTypeId Record type ID. Pass '012000000000000AAA' for the master record type. 96 | */ 97 | export function getPicklistValuesByRecordType(objectApiName: string, recordTypeId: string): void; 98 | } 99 | 100 | /** 101 | * JavaScript API to Create and Update Records. 102 | */ 103 | declare module 'lightning/uiRecordApi' { 104 | /** 105 | * Identifier for an object. 106 | */ 107 | export interface ObjectId { 108 | /** The object's API name. */ 109 | objectApiName: string; 110 | } 111 | 112 | /** 113 | * Identifier for an object's field. 114 | */ 115 | export interface FieldId { 116 | /** The field's API name. */ 117 | fieldApiName: string; 118 | /** The object's API name. */ 119 | objectApiName: string; 120 | } 121 | 122 | export type FieldValueRepresentationValue = null | boolean | number | string | RecordRepresentation; 123 | export interface FieldValueRepresentation { 124 | displayValue: string | null; 125 | value: FieldValueRepresentationValue; 126 | } 127 | 128 | export interface RecordCollectionRepresentation { 129 | eTag?: string; 130 | count: number; 131 | currentPageToken: string; 132 | currentPageUrl: string; 133 | nextPageToken: string; 134 | nextPageUrl: string; 135 | previousPageToken: string; 136 | previousPageUrl: string; 137 | records: RecordRepresentation[]; 138 | } 139 | 140 | export interface RecordTypeInfoRepresentation { 141 | available: boolean; 142 | defaultRecordTypeMapping: boolean; 143 | master: boolean; 144 | name: string; 145 | recordTypeId: string; 146 | } 147 | 148 | export interface RecordRepresentation { 149 | apiName: string; 150 | childRelationships?: { [key: string]: RecordCollectionRepresentation }; 151 | fields: { [key: string]: FieldValueRepresentation }; 152 | id: string; 153 | lastModifiedById: string; 154 | lastModifiedDate: string; 155 | recordTypeInfo?: RecordTypeInfoRepresentation; 156 | systemModstamp: string; 157 | } 158 | 159 | export interface RecordInput { 160 | apiName?: string; 161 | fields: { [key: string]: string | null }; 162 | allowSaveOnDuplicate?: boolean; 163 | recordTypeInfo?: RecordTypeInfoRepresentation; 164 | LastModifiedDate?: string; 165 | } 166 | 167 | export interface ClientOptions { 168 | eTagToCheck?: string; 169 | ifUnmodifiedSince?: string; 170 | } 171 | 172 | export interface ChildRelationshipRepresentation { 173 | childObjectApiName: string; 174 | fieldName: string; 175 | junctionIdListNames: string[]; 176 | junctionReferenceTo: string[]; 177 | relationshipName: string; 178 | } 179 | 180 | export interface ReferenceToInfoRepresentation { 181 | apiName: string; 182 | nameFields: string[]; 183 | } 184 | 185 | export interface FilteredLookupInfoRepresentation { 186 | controllingFields: string[]; 187 | dependent: boolean; 188 | optionalFilter: boolean; 189 | } 190 | 191 | export const enum ExtraTypeInfo { 192 | ExternalLookup = 'ExternalLookup', 193 | ImageUrl = 'ImageUrl', 194 | IndirectLookup = 'IndirectLookup', 195 | PersonName = 'PersonName', 196 | PlainTextArea = 'PlainTextArea', 197 | RichTextArea = 'RichTextArea', 198 | SwitchablePersonName = 'SwitchablePersonName', 199 | } 200 | 201 | export const enum RecordFieldDataType { 202 | Address = 'Address', 203 | Base64 = 'Base64', 204 | Boolean = 'Boolean', 205 | ComboBox = 'ComboBox', 206 | ComplexValue = 'ComplexValue', 207 | Currency = 'Currency', 208 | Date = 'Date', 209 | DateTime = 'DateTime', 210 | Double = 'Double', 211 | Email = 'Email', 212 | EncryptedString = 'EncryptedString', 213 | Int = 'Int', 214 | Location = 'Location', 215 | MultiPicklist = 'MultiPicklist', 216 | Percent = 'Percent', 217 | Phone = 'Phone', 218 | Picklist = 'Picklist', 219 | Reference = 'Reference', 220 | String = 'String', 221 | TextArea = 'TextArea', 222 | Time = 'Time', 223 | Url = 'Url', 224 | } 225 | 226 | export interface FieldRepresentation { 227 | apiName: string; 228 | calculated: boolean; 229 | compound: boolean; 230 | compoundComponentName: string; 231 | compoundFieldName: string; 232 | controllerName: string; 233 | controllingFields: string[]; 234 | createable: boolean; 235 | custom: boolean; 236 | dataType: RecordFieldDataType; 237 | extraTypeInfo: ExtraTypeInfo; 238 | filterable: boolean; 239 | filteredLookupInfo: FilteredLookupInfoRepresentation; 240 | highScaleNumber: boolean; 241 | htmlFormatted: boolean; 242 | inlineHelpText: string; 243 | label: string; 244 | length: number; 245 | nameField: boolean; 246 | polymorphicForeignKey: boolean; 247 | precision: number; 248 | reference: boolean; 249 | referenceTargetField: string; 250 | referenceToInfos: ReferenceToInfoRepresentation[]; 251 | relationshipName: string; 252 | required: boolean; 253 | scale: number; 254 | searchPrefilterable: boolean; 255 | sortable: boolean; 256 | unique: boolean; 257 | updateable: boolean; 258 | } 259 | 260 | interface ThemeInfoRepresentation { 261 | color: string; 262 | iconUrl: string; 263 | } 264 | 265 | export interface ObjectInfoRepresentation { 266 | apiName: string; 267 | childRelationships: ChildRelationshipRepresentation[]; 268 | createable: boolean; 269 | custom: boolean; 270 | defaultRecordTypeId: string; 271 | deletable: boolean; 272 | deleteable: boolean; 273 | dependentFields: { [key: string]: any }; 274 | eTag: string; 275 | feedEnabled: boolean; 276 | fields: { [key: string]: FieldRepresentation }; 277 | keyPrefix: string; 278 | label: string; 279 | labelPlural: string; 280 | layoutable: boolean; 281 | mruEnabled: boolean; 282 | nameFields: string[]; 283 | queryable: boolean; 284 | recordTypeInfos: { [key: string]: RecordTypeInfoRepresentation }; 285 | searchable: boolean; 286 | themeInfo: ThemeInfoRepresentation; 287 | updateable: boolean; 288 | } 289 | 290 | /** 291 | * Wire adapter for a record. 292 | * 293 | * https://developer.salesforce.com/docs/atlas.en-us.uiapi.meta/uiapi/ui_api_resources_record_get.htm 294 | * 295 | * @param recordId ID of the record to retrieve. 296 | * @param fields Object-qualified field API names to retrieve. If a field isn’t accessible to the context user, it causes an error. 297 | * If specified, don't specify layoutTypes. 298 | * @param layoutTypes Layouts defining the fields to retrieve. If specified, don't specify fields. 299 | * @param modes Layout modes defining the fields to retrieve. 300 | * @param optionalFields Object-qualified field API names to retrieve. If an optional field isn’t accessible to the context user, 301 | * it isn’t included in the response, but it doesn’t cause an error. 302 | * @returns An observable of the record. 303 | */ 304 | export function getRecord( 305 | recordId: string, 306 | fields?: Array, 307 | layoutTypes?: string[], 308 | modes?: string[], 309 | optionalFields?: Array, 310 | ): void; 311 | 312 | /** 313 | * Wire adapter for default field values to create a record. 314 | * 315 | * https://developer.salesforce.com/docs/atlas.en-us.uiapi.meta/uiapi/ui_api_resources_record_defaults_create.htm#ui_api_resources_record_defaults_create 316 | * 317 | * @param objectApiName API name of the object. 318 | * @param formFactor Form factor. Possible values are 'Small', 'Medium', 'Large'. Large is default. 319 | * @param recordTypeId Record type id. 320 | * @param optionalFields Object-qualified field API names to retrieve. If an optional field isn’t accessible to the context user, 321 | * it isn’t included in the response, but it doesn’t cause an error. 322 | */ 323 | export function getRecordCreateDefaults( 324 | objectApiName: string | ObjectId, 325 | formFactor?: string, 326 | recordTypeId?: string, 327 | optionalFields?: Array, 328 | ): void; 329 | 330 | /** 331 | * Wire adapter for record data, object metadata and layout metadata 332 | * 333 | * https://developer.salesforce.com/docs/atlas.en-us.uiapi.meta/uiapi/ui_api_resources_record_ui.htm 334 | * 335 | * @param recordIds ID of the records to retrieve. 336 | * @param layoutTypes Layouts defining the fields to retrieve. 337 | * @param modes Layout modes defining the fields to retrieve. 338 | * @param optionalFields Object-qualified field API names to retrieve. If an optional field isn’t accessible to the context user, 339 | * it isn’t included in the response, but it doesn’t cause an error. 340 | */ 341 | export function getRecordUi( 342 | recordIds: string | string[], 343 | layoutTypes: string | string[], 344 | modes: string | string[], 345 | optionalFields: Array, 346 | ): void; 347 | 348 | /** 349 | * Updates a record using the properties in recordInput. recordInput.fields.Id must be specified. 350 | * @param recordInput The record input representation to use to update the record. 351 | * @param clientOptions Controls the update behavior. Specify ifUnmodifiedSince to fail the save if the record has changed since the provided value. 352 | * @returns A promise that will resolve with the patched record. 353 | */ 354 | export function updateRecord(recordInput: RecordInput, clientOptions?: ClientOptions): Promise; 355 | 356 | /** 357 | * Creates a new record using the properties in recordInput. 358 | * @param recordInput The RecordInput object to use to create the record. 359 | * @returns A promise that will resolve with the newly created record. 360 | */ 361 | export function createRecord(recordInput: RecordInput): Promise; 362 | 363 | /** 364 | * Deletes a record with the specified recordId. 365 | * @param recordId ID of the record to delete. 366 | * @returns A promise that will resolve to undefined. 367 | */ 368 | export function deleteRecord(recordId: string): Promise; 369 | 370 | /** 371 | * Returns an object with its data populated from the given record. All fields with values that aren't nested records will be assigned. 372 | * This object can be used to create a record with createRecord(). 373 | * @param record The record that contains the source data. 374 | * @param objectInfo The ObjectInfo corresponding to the apiName on the record. If provided, only fields that are createable=true 375 | * (excluding Id) are assigned to the object return value. 376 | * @returns RecordInput 377 | */ 378 | export function generateRecordInputForCreate(record: RecordRepresentation, objectInfo?: ObjectInfoRepresentation): RecordInput; 379 | 380 | /** 381 | * Returns an object with its data populated from the given record. All fields with values that aren't nested records will be assigned. 382 | * This object can be used to update a record. 383 | * @param record The record that contains the source data. 384 | * @param objectInfo The ObjectInfo corresponding to the apiName on the record. 385 | * If provided, only fields that are updateable=true (excluding Id) are assigned to the object return value. 386 | * @returns RecordInput. 387 | */ 388 | export function generateRecordInputForUpdate(record: RecordRepresentation, objectInfo?: ObjectInfoRepresentation): RecordInput; 389 | 390 | /** 391 | * Returns a new RecordInput containing a list of fields that have been edited from their original values. (Also contains the Id 392 | * field, which is always copied over.) 393 | * @param recordInput The RecordInput object to filter. 394 | * @param originalRecord The Record object that contains the original field values. 395 | * @returns RecordInput. 396 | */ 397 | export function createRecordInputFilteredByEditedFields(recordInput: RecordInput, originalRecord: RecordRepresentation): RecordInput; 398 | 399 | /** 400 | * Gets a field's value from a record. 401 | * @param record The record. 402 | * @param field Object-qualified API name of the field to return. 403 | * @returns The field's value (which may be a record in the case of spanning fields), or undefined if the field isn't found. 404 | */ 405 | export function getFieldValue(record: RecordRepresentation, field: FieldId | string): FieldValueRepresentationValue | undefined; 406 | 407 | /** 408 | * Gets a field's display value from a record. 409 | * @param record The record. 410 | * @param field Object-qualified API name of the field to return. 411 | * @returns The field's display value, or undefined if the field isn't found. 412 | */ 413 | export function getFieldDisplayValue(record: RecordRepresentation, field: FieldId | string): FieldValueRepresentationValue | undefined; 414 | } 415 | -------------------------------------------------------------------------------- /.sfdx/typings/lwc/schema.d.ts: -------------------------------------------------------------------------------- 1 | declare module "@salesforce/schema" { 2 | /** 3 | * Identifier for an object. 4 | */ 5 | export interface ObjectId { 6 | /** The object's API name. */ 7 | objectApiName: string; 8 | } 9 | 10 | /** 11 | * Identifier for an object's field. 12 | */ 13 | export interface FieldId { 14 | /** The field's API name. */ 15 | fieldApiName: string; 16 | /** The object's API name. */ 17 | objectApiName: string; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /.sfdx/typings/lwc/user.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * User's Id. 3 | */ 4 | declare module "@salesforce/user/Id" { 5 | const id: string; 6 | export default id; 7 | } 8 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "eslint.nodePath": "c:\\Users\\fhuot\\.vscode\\extensions\\salesforce.salesforcedx-vscode-lwc-46.7.0\\node_modules", 3 | "html.suggest.angular1": false, 4 | "html.suggest.ionic": false, 5 | "salesforcedx-vscode-core.show-cli-success-msg": false 6 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Knowledge Search Lightning Web Component 2 | Lightning Web Component used for searching Lightning Knowledge articles 3 | 4 | ## How to use it
5 | 6 | Knowledge utility bar widget : 7 | ![Knowledge widget](https://github.com/FabienHuot/KnowledgeSearch/blob/master/assets/Widget.png) 8 | 9 | 10 | On a record detail page : 11 | 12 | ![Knowledge record detail](https://github.com/FabienHuot/KnowledgeSearch/blob/master/assets/Record%20page.png) 13 | 14 | 15 | 16 | 17 | How to install it ! 18 | Step 1 ) Clone the repo
19 | Step 2 ) Run the command : ./setupScratchOrg
20 | Step 3 ) Create cases with record types (QA Salesforce, QA Trailhead)
21 | Step 4 ) Open the component and search for articles
22 | 23 | This script will setup a scratch org with this configuration :
24 | - Pushging Metadata (Application, Apex Classes, FlexiPage, LWC)
25 | - Set the permission set to be a Knowledge User
26 | - Set the permission set to access to the Knowledge App
27 | - Importing demo's articles
28 | 29 | Current version : 30 | 31 | - Adding redirection to Knowledge articles in a new browser tab. 32 | - Available for both Lightning Record Page && Utility Bar Item 33 | - Conditionnal styling (utility component / lightning web component) 34 | 35 | 36 | TODO : 37 | 38 | - Remove the "hide/show" when the component is used in the utility bar 39 | - Make inputs and filters dynamically. 40 | 41 | Scratch Org : 42 | 43 | - Generate a username for the new knowledge user created 44 | - Enable the 'Organization Admins Can Login as Any User' feature by default 45 | 46 | -------------------------------------------------------------------------------- /assets/Record page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FabienHuot/KnowledgeSearch/6d9aa4c59cb850a3382e25d1865f0933139794e9/assets/Record page.png -------------------------------------------------------------------------------- /assets/Widget.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FabienHuot/KnowledgeSearch/6d9aa4c59cb850a3382e25d1865f0933139794e9/assets/Widget.png -------------------------------------------------------------------------------- /config/project-scratch-def.json: -------------------------------------------------------------------------------- 1 | { 2 | "orgName": "Lightning Knowledge Search Component1", 3 | "edition": "Developer", 4 | "features": [ 5 | "KNOWLEDGE" 6 | ], 7 | "settings": { 8 | "orgPreferenceSettings": { 9 | "s1DesktopEnabled": true 10 | }, 11 | "knowledgeSettings":{ 12 | "enableKnowledge": true, 13 | "enableLightningKnowledge" : true 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /config/user-def.json: -------------------------------------------------------------------------------- 1 | { 2 | "Username": "tester1@sfdx.org", 3 | "LastName": "Einstein", 4 | "FirstName" : "Albert", 5 | "Email": "a.einstein@sfdx.org", 6 | "Alias": "aein", 7 | "TimeZoneSidKey": "America/Denver", 8 | "LocaleSidKey": "en_US", 9 | "EmailEncodingKey": "UTF-8", 10 | "LanguageLocaleKey": "en_US", 11 | "profileName": "System Administrator", 12 | "permsets": ["KnowledgeUser"], 13 | "UserPermissionsKnowledgeUser" : true, 14 | "generatePassword": true 15 | } -------------------------------------------------------------------------------- /data/Knowledge-export-query: -------------------------------------------------------------------------------- 1 | SELECT Title, UrlName, Summary, RecordType.DeveloperName FROM Knowledge__kav WHERE PublishStatus='Draft' -------------------------------------------------------------------------------- /data/Knowledge__kav.json: -------------------------------------------------------------------------------- 1 | { 2 | "records": [ 3 | { 4 | "attributes": { 5 | "type": "Knowledge__kav", 6 | "referenceId": "Knowledge__kavRef1" 7 | }, 8 | "Title": "test3", 9 | "UrlName": "test3", 10 | "Summary": "tesff3", 11 | "RecordType": { 12 | "DeveloperName": "QA_Salesforce" 13 | } 14 | } 15 | ] 16 | } -------------------------------------------------------------------------------- /force-app/main/default/appMenus/AppSwitcher.appMenu-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | standard__Platform 5 | CustomApplication 6 | 7 | 8 | standard__Sales 9 | CustomApplication 10 | 11 | 12 | standard__Service 13 | CustomApplication 14 | 15 | 16 | standard__Marketing 17 | CustomApplication 18 | 19 | 20 | standard__ServiceConsole 21 | CustomApplication 22 | 23 | 24 | standard__AppLauncher 25 | CustomApplication 26 | 27 | 28 | standard__Community 29 | CustomApplication 30 | 31 | 32 | standard__Sites 33 | CustomApplication 34 | 35 | 36 | standard__Chatter 37 | CustomApplication 38 | 39 | 40 | standard__Content 41 | CustomApplication 42 | 43 | 44 | standard__Insights 45 | CustomApplication 46 | 47 | 48 | standard__LightningSales 49 | CustomApplication 50 | 51 | 52 | standard__AllTabSet 53 | CustomApplication 54 | 55 | 56 | CPQIntegrationUserApp 57 | ConnectedApp 58 | 59 | 60 | standard__LightningBolt 61 | CustomApplication 62 | 63 | 64 | Knowledge_Search_App 65 | CustomApplication 66 | 67 | 68 | -------------------------------------------------------------------------------- /force-app/main/default/applications/Knowledge_Search_App.app-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | #15D0DA 5 | iconfinder_handdrawngraduationcap_3 6 | 1 7 | false 8 | 9 | Try the Knowledge Search component here :-) 10 | Large 11 | false 12 | false 13 | 14 | Standard 15 | standard-Case 16 | Knowledge__kav 17 | Lightning 18 | Knowledge_Search_App_UtilityBar 19 | 20 | -------------------------------------------------------------------------------- /force-app/main/default/classes/knowledgeSearchController.cls: -------------------------------------------------------------------------------- 1 | public with sharing class knowledgeSearchController { 2 | public knowledgeSearchController() { 3 | } 4 | 5 | @AuraEnabled(cacheable=true) 6 | public static List KnowledgeRecordTypes(){ 7 | List knowledgeRecordTypesValues = new List(); 8 | 9 | // Query all Knowledge__kav active record types 10 | for (RecordType rt : [SELECT Name FROM RecordType WHERE IsActive = true AND SobjectType = 'Knowledge__kav']) { 11 | knowledgeRecordTypesValues.add(rt.Name); 12 | } 13 | System.debug('knowledgeRecordTypesValues:' + knowledgeRecordTypesValues); 14 | return knowledgeRecordTypesValues; 15 | } 16 | 17 | 18 | @AuraEnabled(cacheable=true) 19 | public static List KnowledgeArticles(String input, String cat) { 20 | List knowledgeArticlesList = new List(); 21 | 22 | // Searching in Knowledge Subject 23 | if (input != '' && input != null) { 24 | String knowledgeQuery = ''; 25 | if (cat != null && cat != '' && cat != 'All') { 26 | knowledgeQuery = 'SELECT Id, Title, Summary FROM Knowledge__kav WHERE Title LIKE \'%' + input + '%\' AND RecordType.Name = ' + '\'' + cat + '\' LIMIT 10'; 27 | } 28 | else { 29 | knowledgeQuery = 'SELECT Id, Title, Summary FROM Knowledge__kav WHERE Title LIKE \'%' + input + '%\' LIMIT 10'; 30 | } 31 | knowledgeArticlesList = Database.query(knowledgeQuery); 32 | } 33 | return knowledgeArticlesList; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /force-app/main/default/classes/knowledgeSearchController.cls-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 46.0 4 | Active 5 | 6 | -------------------------------------------------------------------------------- /force-app/main/default/contentassets/iconfinder_handdrawngraduationcap_3.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FabienHuot/KnowledgeSearch/6d9aa4c59cb850a3382e25d1865f0933139794e9/force-app/main/default/contentassets/iconfinder_handdrawngraduationcap_3.asset -------------------------------------------------------------------------------- /force-app/main/default/contentassets/iconfinder_handdrawngraduationcap_3.asset-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | false 4 | en_US 5 | iconfinder_handdrawngraduationcap_3 6 | 7 | 8 | VIEWER 9 | 10 | 11 | 12 | 13 | 1 14 | iconfinder_handdrawn-graduation-cap_335396 (1).png 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /force-app/main/default/flexipages/Case_Record_Page.flexipage-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | collapsed 7 | false 8 | 9 | 10 | numVisibleActions 11 | 3 12 | 13 | force:highlightsPanel 14 | 15 | Replace 16 | header 17 | Region 18 | 19 | 20 | 21 | forceChatter:recordFeedContainer 22 | 23 | Replace 24 | feedTabContent 25 | Facet 26 | 27 | 28 | 29 | 30 | relatedListComponentOverride 31 | NONE 32 | 33 | 34 | rowsToDisplay 35 | 10 36 | 37 | 38 | showActionBar 39 | true 40 | 41 | force:relatedListContainer 42 | 43 | Replace 44 | relatedTabContent 45 | Facet 46 | 47 | 48 | 49 | 50 | active 51 | true 52 | 53 | 54 | body 55 | feedTabContent 56 | 57 | 58 | title 59 | Standard.Tab.feed 60 | 61 | flexipage:tab 62 | 63 | 64 | 65 | body 66 | relatedTabContent 67 | 68 | 69 | title 70 | Standard.Tab.relatedLists 71 | 72 | flexipage:tab 73 | 74 | Replace 75 | tabs 76 | Facet 77 | 78 | 79 | 80 | 81 | tabs 82 | tabs 83 | 84 | flexipage:tabset 85 | 86 | Replace 87 | main 88 | Region 89 | 90 | 91 | 92 | 93 | displayCard 94 | true 95 | 96 | knowledgeSearch 97 | 98 | 99 | forceKnowledge:articleSearchDesktop 100 | 101 | 102 | force:detailPanel 103 | 104 | Replace 105 | sidebar 106 | Region 107 | 108 | Case Record Page 109 | sfa__Case_rec_L 110 | Case 111 | 114 | RecordPage 115 | 116 | -------------------------------------------------------------------------------- /force-app/main/default/flexipages/Knowledge_Search_App_UtilityBar.flexipage-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | displayCard 7 | false 8 | 9 | 10 | eager 11 | decorator 12 | false 13 | 14 | 15 | height 16 | decorator 17 | 480 18 | 19 | 20 | icon 21 | decorator 22 | fallback 23 | 24 | 25 | label 26 | decorator 27 | Knowledge Search 28 | 29 | 30 | scrollable 31 | decorator 32 | true 33 | 34 | 35 | width 36 | decorator 37 | 500 38 | 39 | knowledgeSearch 40 | 41 | utilityItems 42 | Region 43 | 44 | 45 | backgroundComponents 46 | Background 47 | 48 | Knowledge Search App UtilityBar 49 | 52 | UtilityBar 53 | 54 | -------------------------------------------------------------------------------- /force-app/main/default/layouts/Knowledge__kav-Knowledge Layout.layout-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | false 5 | true 6 | true 7 | 8 | 9 | 10 | Title 11 | 12 | 13 | UrlName 14 | 15 | 16 | 17 | 18 | RecordTypeId 19 | 20 | 21 | Summary 22 | 23 | 24 | PublishStatus 25 | 26 | 27 | 28 | 29 | 30 | true 31 | true 32 | false 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /force-app/main/default/lwc/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@salesforce/eslint-config-lwc/recommended" 3 | } -------------------------------------------------------------------------------- /force-app/main/default/lwc/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "experimentalDecorators": true, 4 | "baseUrl": ".", 5 | "paths": { 6 | "c/knowledgeSearch": [ 7 | "knowledgeSearch/knowledgeSearch.js" 8 | ] 9 | } 10 | }, 11 | "include": [ 12 | "**/*", 13 | "../../../../.sfdx/typings/lwc/**/*.d.ts" 14 | ], 15 | "typeAcquisition": { 16 | "include": [ 17 | "jest" 18 | ] 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /force-app/main/default/lwc/knowledgeSearch/knowledgeSearch.css: -------------------------------------------------------------------------------- 1 | :host .slds-page-header{ 2 | background-color:white; 3 | } 4 | 5 | :host .data-list { 6 | padding:0 12px 0 0 !important; 7 | } 8 | 9 | :host .adjust-padding { 10 | padding:0 0 0 12px; 11 | } 12 | 13 | :host .float-left { 14 | float:left; 15 | } 16 | 17 | :host .size { 18 | line-height: 1rem; 19 | font-size: 1rem; 20 | } 21 | 22 | :host .size:hover { 23 | cursor: pointer; 24 | 25 | } 26 | 27 | :host .title { 28 | line-height: 1rem; 29 | } -------------------------------------------------------------------------------- /force-app/main/default/lwc/knowledgeSearch/knowledgeSearch.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /force-app/main/default/lwc/knowledgeSearch/knowledgeSearch.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | 3 | import { LightningElement, track, wire, api } from 'lwc'; 4 | 5 | import { NavigationMixin } from 'lightning/navigation'; 6 | 7 | import KnowledgeRecordTypes from '@salesforce/apex/knowledgeSearchController.KnowledgeRecordTypes'; 8 | import KnowledgeArticles from '@salesforce/apex/knowledgeSearchController.KnowledgeArticles'; 9 | //import getPicklistValues from '@salesforce/apex/knowledgeSearchLWC.getPicklistValues_old'; 10 | 11 | export default class KnowledgeSearchLWC extends NavigationMixin(LightningElement) { 12 | @track article; 13 | @track articleList = []; 14 | 15 | 16 | @track results 17 | 18 | //@track cible = 'Tous'; 19 | 20 | @track rt = 'All'; 21 | @track rtList = []; 22 | 23 | @api displayCard; 24 | 25 | get componentClass() { 26 | return (this.displayCard ? 'slds-page-header' : 'slds-m-around_medium'); 27 | } 28 | 29 | @wire(KnowledgeRecordTypes) 30 | wiredRecordTypes({error, data}) { 31 | if (data) { 32 | this.rtList = data; 33 | console.log('data', data); 34 | this.error = undefined; 35 | } 36 | if (error) { 37 | this.error = error; 38 | console.log('data error', error); 39 | this.rtList = undefined; 40 | } 41 | }; 42 | 43 | @wire(KnowledgeArticles, {input : '$article', cat : '$rt'}) 44 | wiredArticles({error, data}) { 45 | if (data) { 46 | 47 | this.articleList = []; 48 | for (let article of data) { 49 | let myArticle = {}; 50 | myArticle.data = article; 51 | 52 | // Get article url 53 | this.KnowledgePageRef = { 54 | type: "standard__recordPage", 55 | attributes: { 56 | "recordId": article.Id, 57 | "objectApiName": "Knowledge__kav", 58 | "actionName": "view" 59 | } 60 | }; 61 | 62 | this[NavigationMixin.GenerateUrl](this.KnowledgePageRef) 63 | .then(articleUrl => { 64 | myArticle.url = articleUrl; 65 | this.articleList.push(myArticle); 66 | }); 67 | } 68 | 69 | this.error = undefined; 70 | } 71 | if (error) { 72 | this.error = error; 73 | this.articleList = undefined; 74 | } 75 | } 76 | 77 | changeHandler(event) { 78 | this.article = event.target.value; 79 | console.log('article', this.article); 80 | } 81 | 82 | handleCible(event) { 83 | this.rt = event.target.value; 84 | console.log('rt', this.rt); 85 | } 86 | 87 | redirectToArticle(event) { 88 | // Navigate to the CaseComments related list page 89 | // for a specific Case record. 90 | event.preventDefault(); 91 | 92 | this[NavigationMixin.Navigate]({ 93 | type: 'standard__recordPage', 94 | attributes: { 95 | recordId: event.currentTarget.dataset.toto, 96 | objectApiName: 'Knowledge__kav', 97 | actionName: 'view' 98 | } 99 | }); 100 | } 101 | } -------------------------------------------------------------------------------- /force-app/main/default/lwc/knowledgeSearch/knowledgeSearch.js-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 45.0 4 | true 5 | Knowledge Search 6 | Search Knowledge articles 7 | 8 | lightning__AppPage 9 | lightning__RecordPage 10 | lightning__HomePage 11 | lightning__UtilityBar 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /force-app/main/default/lwc/knowledgeSearch/knowledgeSearch.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/Case.object-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Accept 5 | Default 6 | 7 | 8 | CancelEdit 9 | Default 10 | 11 | 12 | ChangeStatus 13 | Default 14 | 15 | 16 | Clone 17 | Default 18 | 19 | 20 | CloneAsChild 21 | Default 22 | 23 | 24 | CloseCase 25 | Default 26 | 27 | 28 | Delete 29 | Default 30 | 31 | 32 | Edit 33 | Default 34 | 35 | 36 | List 37 | Default 38 | 39 | 40 | MassClose 41 | Default 42 | 43 | 44 | NewCase 45 | Default 46 | 47 | 48 | SaveEdit 49 | Default 50 | 51 | 52 | Tab 53 | Default 54 | 55 | 56 | View 57 | Action override created by Lightning App Builder during activation. 58 | Case_Record_Page 59 | Large 60 | false 61 | Flexipage 62 | 63 | SYSTEM 64 | true 65 | 66 | CASES.CASE_NUMBER 67 | CASES.SUBJECT 68 | CASES.CREATED_DATE 69 | CASES.PRIORITY 70 | CASES.CASE_NUMBER 71 | CASES.SUBJECT 72 | NAME 73 | ACCOUNT.NAME 74 | CASES.STATUS 75 | CASES.CASE_NUMBER 76 | CASES.SUBJECT 77 | NAME 78 | ACCOUNT.NAME 79 | CASES.STATUS 80 | CASES.CASE_NUMBER 81 | CASES.SUBJECT 82 | CASES.STATUS 83 | CASES.CREATED_DATE 84 | CORE.USERS.ALIAS 85 | 86 | ReadWriteTransfer 87 | 88 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/AccountId.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | AccountId 4 | false 5 | false 6 | false 7 | Lookup 8 | 9 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/AssetId.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | AssetId 4 | false 5 | true 6 | false 7 | Lookup 8 | 9 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/BusinessHoursId.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | BusinessHoursId 4 | false 5 | false 6 | false 7 | Lookup 8 | 9 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/ClosedDate.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ClosedDate 4 | false 5 | 6 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/Comments.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Comments 4 | false 5 | 6 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/ContactEmail.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ContactEmail 4 | false 5 | 6 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/ContactFax.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ContactFax 4 | false 5 | 6 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/ContactId.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ContactId 4 | false 5 | true 6 | false 7 | Lookup 8 | 9 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/ContactMobile.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ContactMobile 4 | false 5 | 6 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/ContactPhone.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ContactPhone 4 | false 5 | 6 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/Description.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Description 4 | false 5 | true 6 | false 7 | 8 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/IsClosedOnCreate.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | IsClosedOnCreate 4 | false 5 | false 6 | false 7 | 8 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/IsEscalated.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | IsEscalated 4 | false 5 | false 6 | false 7 | 8 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/Origin.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Origin 4 | false 5 | true 6 | false 7 | Picklist 8 | 9 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/OwnerId.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | OwnerId 4 | true 5 | true 6 | false 7 | Lookup 8 | 9 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/ParentId.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ParentId 4 | false 5 | false 6 | false 7 | Lookup 8 | 9 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/Priority.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Priority 4 | true 5 | true 6 | false 7 | Picklist 8 | 9 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/Reason.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Reason 4 | false 5 | true 6 | false 7 | Picklist 8 | 9 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/Status.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Status 4 | false 5 | true 6 | false 7 | Picklist 8 | 9 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/Subject.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Subject 4 | false 5 | true 6 | false 7 | 8 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/SuppliedCompany.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | SuppliedCompany 4 | false 5 | 6 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/SuppliedEmail.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | SuppliedEmail 4 | false 5 | 6 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/SuppliedName.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | SuppliedName 4 | false 5 | 6 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/SuppliedPhone.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | SuppliedPhone 4 | false 5 | 6 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Case/fields/Type.field-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Type 4 | false 5 | true 6 | false 7 | Picklist 8 | 9 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Knowledge__kav/recordTypes/QA_Salesforce.recordType-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | QA_Salesforce 4 | true 5 | 6 | 7 | -------------------------------------------------------------------------------- /force-app/main/default/objects/Knowledge__kav/recordTypes/QA_Trailhead.recordType-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | QA_Trailhead 4 | true 5 | 6 | 7 | -------------------------------------------------------------------------------- /force-app/main/default/permissionsets/KnowledgeAppUser.permissionset-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Knowledge_Search_App 5 | true 6 | 7 | false 8 | 9 | 10 | -------------------------------------------------------------------------------- /force-app/main/default/permissionsets/KnowledgeUser.permissionset-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | false 4 | 5 | 6 | true 7 | true 8 | true 9 | true 10 | true 11 | Knowledge__kav 12 | true 13 | 14 | 15 | Knowledge__kav 16 | Visible 17 | 18 | 19 | standard-Knowledge 20 | Visible 21 | 22 | 23 | true 24 | AllowUniversalSearch 25 | 26 | 27 | true 28 | AllowViewKnowledge 29 | 30 | 31 | true 32 | ArchiveArticles 33 | 34 | 35 | true 36 | EditKnowledge 37 | 38 | 39 | true 40 | EditTranslation 41 | 42 | 43 | true 44 | ManageKnowledge 45 | 46 | 47 | true 48 | ManageKnowledgeImportExport 49 | 50 | 51 | true 52 | PublishArticles 53 | 54 | 55 | true 56 | PublishTranslation 57 | 58 | 59 | true 60 | ShareInternalArticles 61 | 62 | 63 | true 64 | SubmitForTranslation 65 | 66 | 67 | -------------------------------------------------------------------------------- /force-app/main/default/profiles/Admin.profile-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Knowledge_Search_App 5 | false 6 | false 7 | 8 | 9 | knowledgeSearchController 10 | true 11 | 12 | false 13 | 14 | Knowledge__kav-Knowledge Layout 15 | 16 | 17 | Knowledge__kav-Knowledge Layout 18 | Knowledge__kav.QA_Salesforce 19 | 20 | 21 | Knowledge__kav-Knowledge Layout 22 | Knowledge__kav.QA_Trailhead 23 | 24 | 25 | true 26 | Knowledge__kav.QA_Salesforce 27 | true 28 | 29 | 30 | false 31 | Knowledge__kav.QA_Trailhead 32 | true 33 | 34 | Salesforce 35 | 36 | true 37 | ActivateContract 38 | 39 | 40 | true 41 | ActivateOrder 42 | 43 | 44 | true 45 | ActivitiesAccess 46 | 47 | 48 | true 49 | AddDirectMessageMembers 50 | 51 | 52 | true 53 | AllowUniversalSearch 54 | 55 | 56 | true 57 | AllowViewKnowledge 58 | 59 | 60 | true 61 | ApexRestServices 62 | 63 | 64 | true 65 | ApiEnabled 66 | 67 | 68 | true 69 | ArchiveArticles 70 | 71 | 72 | true 73 | AssignPermissionSets 74 | 75 | 76 | true 77 | AssignTopics 78 | 79 | 80 | true 81 | AuthorApex 82 | 83 | 84 | true 85 | BulkMacrosAllowed 86 | 87 | 88 | true 89 | CanInsertFeedSystemFields 90 | 91 | 92 | true 93 | CanUseNewDashboardBuilder 94 | 95 | 96 | true 97 | CanVerifyComment 98 | 99 | 100 | true 101 | ChangeDashboardColors 102 | 103 | 104 | true 105 | ChatterEditOwnPost 106 | 107 | 108 | true 109 | ChatterEditOwnRecordPost 110 | 111 | 112 | true 113 | ChatterFileLink 114 | 115 | 116 | true 117 | ChatterInternalUser 118 | 119 | 120 | true 121 | ChatterInviteExternalUsers 122 | 123 | 124 | true 125 | ChatterOwnGroups 126 | 127 | 128 | true 129 | ConnectOrgToEnvironmentHub 130 | 131 | 132 | true 133 | ContentAdministrator 134 | 135 | 136 | true 137 | ContentWorkspaces 138 | 139 | 140 | true 141 | ConvertLeads 142 | 143 | 144 | true 145 | CreateContentSpace 146 | 147 | 148 | true 149 | CreateCustomizeDashboards 150 | 151 | 152 | true 153 | CreateCustomizeFilters 154 | 155 | 156 | true 157 | CreateCustomizeReports 158 | 159 | 160 | true 161 | CreateDashboardFolders 162 | 163 | 164 | true 165 | CreateLtngTempFolder 166 | 167 | 168 | true 169 | CreateReportFolders 170 | 171 | 172 | true 173 | CreateTopics 174 | 175 | 176 | true 177 | CreateWorkBadgeDefinition 178 | 179 | 180 | true 181 | CreateWorkspaces 182 | 183 | 184 | true 185 | CustomizeApplication 186 | 187 | 188 | true 189 | DataExport 190 | 191 | 192 | true 193 | DelegatedTwoFactor 194 | 195 | 196 | true 197 | DeleteActivatedContract 198 | 199 | 200 | true 201 | DeleteTopics 202 | 203 | 204 | true 205 | DistributeFromPersWksp 206 | 207 | 208 | true 209 | EditActivatedOrders 210 | 211 | 212 | true 213 | EditBrandTemplates 214 | 215 | 216 | true 217 | EditCaseComments 218 | 219 | 220 | true 221 | EditEvent 222 | 223 | 224 | true 225 | EditHtmlTemplates 226 | 227 | 228 | true 229 | EditKnowledge 230 | 231 | 232 | true 233 | EditMyDashboards 234 | 235 | 236 | true 237 | EditMyReports 238 | 239 | 240 | true 241 | EditOppLineItemUnitPrice 242 | 243 | 244 | true 245 | EditPublicDocuments 246 | 247 | 248 | true 249 | EditPublicFilters 250 | 251 | 252 | true 253 | EditPublicTemplates 254 | 255 | 256 | true 257 | EditReadonlyFields 258 | 259 | 260 | true 261 | EditTask 262 | 263 | 264 | true 265 | EditTopics 266 | 267 | 268 | true 269 | EditTranslation 270 | 271 | 272 | true 273 | EmailMass 274 | 275 | 276 | true 277 | EmailSingle 278 | 279 | 280 | true 281 | EnableCommunityAppLauncher 282 | 283 | 284 | true 285 | EnableNotifications 286 | 287 | 288 | true 289 | ExportReport 290 | 291 | 292 | true 293 | FieldServiceAccess 294 | 295 | 296 | true 297 | GiveRecognitionBadge 298 | 299 | 300 | true 301 | ImportCustomObjects 302 | 303 | 304 | true 305 | ImportLeads 306 | 307 | 308 | true 309 | ImportPersonal 310 | 311 | 312 | true 313 | InstallPackaging 314 | 315 | 316 | true 317 | LightningConsoleAllowedForUser 318 | 319 | 320 | true 321 | LightningExperienceUser 322 | 323 | 324 | true 325 | ListEmailSend 326 | 327 | 328 | true 329 | ManageAnalyticSnapshots 330 | 331 | 332 | true 333 | ManageAuthProviders 334 | 335 | 336 | true 337 | ManageBusinessHourHolidays 338 | 339 | 340 | true 341 | ManageCallCenters 342 | 343 | 344 | true 345 | ManageCases 346 | 347 | 348 | true 349 | ManageCategories 350 | 351 | 352 | true 353 | ManageCertificates 354 | 355 | 356 | true 357 | ManageContentPermissions 358 | 359 | 360 | true 361 | ManageContentProperties 362 | 363 | 364 | true 365 | ManageContentTypes 366 | 367 | 368 | true 369 | ManageCustomPermissions 370 | 371 | 372 | true 373 | ManageCustomReportTypes 374 | 375 | 376 | true 377 | ManageDashbdsInPubFolders 378 | 379 | 380 | true 381 | ManageDataCategories 382 | 383 | 384 | true 385 | ManageDataIntegrations 386 | 387 | 388 | true 389 | ManageDynamicDashboards 390 | 391 | 392 | true 393 | ManageEmailClientConfig 394 | 395 | 396 | true 397 | ManageExchangeConfig 398 | 399 | 400 | true 401 | ManageHealthCheck 402 | 403 | 404 | true 405 | ManageInteraction 406 | 407 | 408 | true 409 | ManageInternalUsers 410 | 411 | 412 | true 413 | ManageIpAddresses 414 | 415 | 416 | true 417 | ManageKnowledge 418 | 419 | 420 | true 421 | ManageKnowledgeImportExport 422 | 423 | 424 | true 425 | ManageLeads 426 | 427 | 428 | true 429 | ManageLoginAccessPolicies 430 | 431 | 432 | true 433 | ManageMobile 434 | 435 | 436 | true 437 | ManageNetworks 438 | 439 | 440 | true 441 | ManagePackageLicenses 442 | 443 | 444 | true 445 | ManagePasswordPolicies 446 | 447 | 448 | true 449 | ManageProfilesPermissionsets 450 | 451 | 452 | true 453 | ManagePropositions 454 | 455 | 456 | true 457 | ManagePvtRptsAndDashbds 458 | 459 | 460 | true 461 | ManageRecommendationStrategies 462 | 463 | 464 | true 465 | ManageRemoteAccess 466 | 467 | 468 | true 469 | ManageReportsInPubFolders 470 | 471 | 472 | true 473 | ManageRoles 474 | 475 | 476 | true 477 | ManageSearchPromotionRules 478 | 479 | 480 | true 481 | ManageSharing 482 | 483 | 484 | true 485 | ManageSolutions 486 | 487 | 488 | true 489 | ManageSubscriptions 490 | 491 | 492 | true 493 | ManageSynonyms 494 | 495 | 496 | true 497 | ManageUnlistedGroups 498 | 499 | 500 | true 501 | ManageUsers 502 | 503 | 504 | true 505 | MassInlineEdit 506 | 507 | 508 | true 509 | MergeTopics 510 | 511 | 512 | true 513 | ModerateChatter 514 | 515 | 516 | true 517 | ModifyAllData 518 | 519 | 520 | true 521 | ModifyDataClassification 522 | 523 | 524 | true 525 | ModifyMetadata 526 | 527 | 528 | true 529 | NewReportBuilder 530 | 531 | 532 | true 533 | Packaging2 534 | 535 | 536 | true 537 | PrivacyDataAccess 538 | 539 | 540 | true 541 | PublishArticles 542 | 543 | 544 | true 545 | PublishTranslation 546 | 547 | 548 | true 549 | RemoveDirectMessageMembers 550 | 551 | 552 | true 553 | ResetPasswords 554 | 555 | 556 | true 557 | RunReports 558 | 559 | 560 | true 561 | ScheduleReports 562 | 563 | 564 | true 565 | SelectFilesFromSalesforce 566 | 567 | 568 | true 569 | SendExternalEmailAvailable 570 | 571 | 572 | true 573 | SendSitRequests 574 | 575 | 576 | true 577 | ShareInternalArticles 578 | 579 | 580 | true 581 | ShowCompanyNameAsUserBadge 582 | 583 | 584 | true 585 | SolutionImport 586 | 587 | 588 | true 589 | SubmitForTranslation 590 | 591 | 592 | true 593 | SubmitMacrosAllowed 594 | 595 | 596 | true 597 | SubscribeDashboardRolesGrps 598 | 599 | 600 | true 601 | SubscribeDashboardToOtherUsers 602 | 603 | 604 | true 605 | SubscribeReportRolesGrps 606 | 607 | 608 | true 609 | SubscribeReportToOtherUsers 610 | 611 | 612 | true 613 | SubscribeReportsRunAsUser 614 | 615 | 616 | true 617 | SubscribeToLightningDashboards 618 | 619 | 620 | true 621 | SubscribeToLightningReports 622 | 623 | 624 | true 625 | TransactionalEmailSend 626 | 627 | 628 | true 629 | TransferAnyCase 630 | 631 | 632 | true 633 | TransferAnyEntity 634 | 635 | 636 | true 637 | TransferAnyLead 638 | 639 | 640 | true 641 | UseTeamReassignWizards 642 | 643 | 644 | true 645 | UseWebLink 646 | 647 | 648 | true 649 | ViewAllData 650 | 651 | 652 | true 653 | ViewAllUsers 654 | 655 | 656 | true 657 | ViewDataAssessment 658 | 659 | 660 | true 661 | ViewDataCategories 662 | 663 | 664 | true 665 | ViewDataLeakageEvents 666 | 667 | 668 | true 669 | ViewEventLogFiles 670 | 671 | 672 | true 673 | ViewFlowUsageAndFlowEventData 674 | 675 | 676 | true 677 | ViewHealthCheck 678 | 679 | 680 | true 681 | ViewHelpLink 682 | 683 | 684 | true 685 | ViewMyTeamsDashboards 686 | 687 | 688 | true 689 | ViewPublicDashboards 690 | 691 | 692 | true 693 | ViewPublicReports 694 | 695 | 696 | true 697 | ViewRoles 698 | 699 | 700 | true 701 | ViewSetup 702 | 703 | 704 | true 705 | WorkCalibrationUser 706 | 707 | 708 | -------------------------------------------------------------------------------- /force-app/main/default/profiles/Custom%3A Marketing Profile.profile-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Knowledge_Search_App 5 | false 6 | false 7 | 8 | 9 | knowledgeSearchController 10 | false 11 | 12 | true 13 | 14 | false 15 | Case.AccountId 16 | true 17 | 18 | 19 | true 20 | Case.AssetId 21 | true 22 | 23 | 24 | false 25 | Case.BusinessHoursId 26 | false 27 | 28 | 29 | false 30 | Case.ClosedDate 31 | true 32 | 33 | 34 | false 35 | Case.ClosedOnCreate 36 | false 37 | 38 | 39 | true 40 | Case.ContactId 41 | true 42 | 43 | 44 | true 45 | Case.Description 46 | true 47 | 48 | 49 | false 50 | Case.IsClosedOnCreate 51 | false 52 | 53 | 54 | false 55 | Case.IsEscalated 56 | true 57 | 58 | 59 | true 60 | Case.Origin 61 | true 62 | 63 | 64 | false 65 | Case.ParentId 66 | false 67 | 68 | 69 | true 70 | Case.Priority 71 | true 72 | 73 | 74 | true 75 | Case.Reason 76 | true 77 | 78 | 79 | true 80 | Case.Subject 81 | true 82 | 83 | 84 | false 85 | Case.SuppliedCompany 86 | true 87 | 88 | 89 | false 90 | Case.SuppliedEmail 91 | true 92 | 93 | 94 | false 95 | Case.SuppliedName 96 | true 97 | 98 | 99 | false 100 | Case.SuppliedPhone 101 | true 102 | 103 | 104 | true 105 | Case.Type 106 | true 107 | 108 | 109 | Knowledge__kav-Knowledge Layout 110 | 111 | 112 | Knowledge__kav-Knowledge Layout 113 | Knowledge__kav.QA_Salesforce 114 | 115 | 116 | Knowledge__kav-Knowledge Layout 117 | Knowledge__kav.QA_Trailhead 118 | 119 | 120 | true 121 | false 122 | true 123 | true 124 | false 125 | Case 126 | false 127 | 128 | 129 | true 130 | Knowledge__kav.QA_Salesforce 131 | true 132 | 133 | 134 | false 135 | Knowledge__kav.QA_Trailhead 136 | false 137 | 138 | 139 | standard-Case 140 | DefaultOff 141 | 142 | Salesforce 143 | 144 | true 145 | ActivitiesAccess 146 | 147 | 148 | true 149 | AllowViewKnowledge 150 | 151 | 152 | true 153 | ApexRestServices 154 | 155 | 156 | true 157 | ApiEnabled 158 | 159 | 160 | true 161 | AssignTopics 162 | 163 | 164 | true 165 | ChatterInternalUser 166 | 167 | 168 | true 169 | ChatterInviteExternalUsers 170 | 171 | 172 | true 173 | ChatterOwnGroups 174 | 175 | 176 | true 177 | ConvertLeads 178 | 179 | 180 | true 181 | CreateCustomizeFilters 182 | 183 | 184 | true 185 | CreateCustomizeReports 186 | 187 | 188 | true 189 | CreateTopics 190 | 191 | 192 | true 193 | DistributeFromPersWksp 194 | 195 | 196 | true 197 | EditEvent 198 | 199 | 200 | true 201 | EditOppLineItemUnitPrice 202 | 203 | 204 | true 205 | EditTask 206 | 207 | 208 | true 209 | EditTopics 210 | 211 | 212 | true 213 | EmailMass 214 | 215 | 216 | true 217 | EmailSingle 218 | 219 | 220 | true 221 | EnableNotifications 222 | 223 | 224 | true 225 | ExportReport 226 | 227 | 228 | true 229 | ImportPersonal 230 | 231 | 232 | true 233 | LightningConsoleAllowedForUser 234 | 235 | 236 | true 237 | ListEmailSend 238 | 239 | 240 | true 241 | ManageEncryptionKeys 242 | 243 | 244 | true 245 | RunReports 246 | 247 | 248 | true 249 | SelectFilesFromSalesforce 250 | 251 | 252 | true 253 | SendSitRequests 254 | 255 | 256 | true 257 | ShowCompanyNameAsUserBadge 258 | 259 | 260 | true 261 | SubmitMacrosAllowed 262 | 263 | 264 | true 265 | SubscribeToLightningReports 266 | 267 | 268 | true 269 | TransactionalEmailSend 270 | 271 | 272 | true 273 | UseWebLink 274 | 275 | 276 | true 277 | ViewEventLogFiles 278 | 279 | 280 | true 281 | ViewHelpLink 282 | 283 | 284 | true 285 | ViewRoles 286 | 287 | 288 | true 289 | ViewSetup 290 | 291 | 292 | -------------------------------------------------------------------------------- /force-app/main/default/profiles/Custom%3A Sales Profile.profile-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Knowledge_Search_App 5 | false 6 | false 7 | 8 | 9 | knowledgeSearchController 10 | false 11 | 12 | true 13 | 14 | false 15 | Case.AccountId 16 | true 17 | 18 | 19 | true 20 | Case.AssetId 21 | true 22 | 23 | 24 | false 25 | Case.BusinessHoursId 26 | false 27 | 28 | 29 | false 30 | Case.ClosedDate 31 | true 32 | 33 | 34 | false 35 | Case.ClosedOnCreate 36 | false 37 | 38 | 39 | true 40 | Case.ContactId 41 | true 42 | 43 | 44 | true 45 | Case.Description 46 | true 47 | 48 | 49 | false 50 | Case.IsClosedOnCreate 51 | false 52 | 53 | 54 | false 55 | Case.IsEscalated 56 | true 57 | 58 | 59 | true 60 | Case.Origin 61 | true 62 | 63 | 64 | false 65 | Case.ParentId 66 | false 67 | 68 | 69 | true 70 | Case.Priority 71 | true 72 | 73 | 74 | true 75 | Case.Reason 76 | true 77 | 78 | 79 | true 80 | Case.Subject 81 | true 82 | 83 | 84 | false 85 | Case.SuppliedCompany 86 | true 87 | 88 | 89 | false 90 | Case.SuppliedEmail 91 | true 92 | 93 | 94 | false 95 | Case.SuppliedName 96 | true 97 | 98 | 99 | false 100 | Case.SuppliedPhone 101 | true 102 | 103 | 104 | true 105 | Case.Type 106 | true 107 | 108 | 109 | Knowledge__kav-Knowledge Layout 110 | 111 | 112 | Knowledge__kav-Knowledge Layout 113 | Knowledge__kav.QA_Salesforce 114 | 115 | 116 | Knowledge__kav-Knowledge Layout 117 | Knowledge__kav.QA_Trailhead 118 | 119 | 120 | true 121 | false 122 | true 123 | true 124 | false 125 | Case 126 | false 127 | 128 | 129 | true 130 | Knowledge__kav.QA_Salesforce 131 | true 132 | 133 | 134 | false 135 | Knowledge__kav.QA_Trailhead 136 | false 137 | 138 | 139 | standard-Case 140 | DefaultOn 141 | 142 | Salesforce 143 | 144 | true 145 | ActivitiesAccess 146 | 147 | 148 | true 149 | AllowViewKnowledge 150 | 151 | 152 | true 153 | ApexRestServices 154 | 155 | 156 | true 157 | ApiEnabled 158 | 159 | 160 | true 161 | AssignTopics 162 | 163 | 164 | true 165 | ChatterInternalUser 166 | 167 | 168 | true 169 | ChatterInviteExternalUsers 170 | 171 | 172 | true 173 | ChatterOwnGroups 174 | 175 | 176 | true 177 | ConvertLeads 178 | 179 | 180 | true 181 | CreateCustomizeFilters 182 | 183 | 184 | true 185 | CreateCustomizeReports 186 | 187 | 188 | true 189 | CreateTopics 190 | 191 | 192 | true 193 | DistributeFromPersWksp 194 | 195 | 196 | true 197 | EditEvent 198 | 199 | 200 | true 201 | EditOppLineItemUnitPrice 202 | 203 | 204 | true 205 | EditTask 206 | 207 | 208 | true 209 | EditTopics 210 | 211 | 212 | true 213 | EmailMass 214 | 215 | 216 | true 217 | EmailSingle 218 | 219 | 220 | true 221 | EnableNotifications 222 | 223 | 224 | true 225 | ExportReport 226 | 227 | 228 | true 229 | ImportPersonal 230 | 231 | 232 | true 233 | LightningConsoleAllowedForUser 234 | 235 | 236 | true 237 | ListEmailSend 238 | 239 | 240 | true 241 | ManageEncryptionKeys 242 | 243 | 244 | true 245 | RunReports 246 | 247 | 248 | true 249 | SelectFilesFromSalesforce 250 | 251 | 252 | true 253 | SendSitRequests 254 | 255 | 256 | true 257 | ShowCompanyNameAsUserBadge 258 | 259 | 260 | true 261 | SubmitMacrosAllowed 262 | 263 | 264 | true 265 | SubscribeToLightningReports 266 | 267 | 268 | true 269 | TransactionalEmailSend 270 | 271 | 272 | true 273 | UseWebLink 274 | 275 | 276 | true 277 | ViewEventLogFiles 278 | 279 | 280 | true 281 | ViewHelpLink 282 | 283 | 284 | true 285 | ViewRoles 286 | 287 | 288 | true 289 | ViewSetup 290 | 291 | 292 | -------------------------------------------------------------------------------- /force-app/main/default/profiles/Custom%3A Support Profile.profile-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Knowledge_Search_App 5 | false 6 | false 7 | 8 | 9 | knowledgeSearchController 10 | false 11 | 12 | true 13 | 14 | false 15 | Case.AccountId 16 | true 17 | 18 | 19 | true 20 | Case.AssetId 21 | true 22 | 23 | 24 | false 25 | Case.BusinessHoursId 26 | false 27 | 28 | 29 | false 30 | Case.ClosedDate 31 | true 32 | 33 | 34 | false 35 | Case.ClosedOnCreate 36 | false 37 | 38 | 39 | true 40 | Case.ContactId 41 | true 42 | 43 | 44 | true 45 | Case.Description 46 | true 47 | 48 | 49 | false 50 | Case.IsClosedOnCreate 51 | false 52 | 53 | 54 | false 55 | Case.IsEscalated 56 | true 57 | 58 | 59 | true 60 | Case.Origin 61 | true 62 | 63 | 64 | false 65 | Case.ParentId 66 | false 67 | 68 | 69 | true 70 | Case.Priority 71 | true 72 | 73 | 74 | true 75 | Case.Reason 76 | true 77 | 78 | 79 | true 80 | Case.Subject 81 | true 82 | 83 | 84 | false 85 | Case.SuppliedCompany 86 | true 87 | 88 | 89 | false 90 | Case.SuppliedEmail 91 | true 92 | 93 | 94 | false 95 | Case.SuppliedName 96 | true 97 | 98 | 99 | false 100 | Case.SuppliedPhone 101 | true 102 | 103 | 104 | true 105 | Case.Type 106 | true 107 | 108 | 109 | Knowledge__kav-Knowledge Layout 110 | 111 | 112 | Knowledge__kav-Knowledge Layout 113 | Knowledge__kav.QA_Salesforce 114 | 115 | 116 | Knowledge__kav-Knowledge Layout 117 | Knowledge__kav.QA_Trailhead 118 | 119 | 120 | true 121 | true 122 | true 123 | true 124 | false 125 | Case 126 | false 127 | 128 | 129 | true 130 | Knowledge__kav.QA_Salesforce 131 | true 132 | 133 | 134 | false 135 | Knowledge__kav.QA_Trailhead 136 | false 137 | 138 | 139 | standard-Case 140 | DefaultOn 141 | 142 | Salesforce 143 | 144 | true 145 | ActivitiesAccess 146 | 147 | 148 | true 149 | AllowViewKnowledge 150 | 151 | 152 | true 153 | ApexRestServices 154 | 155 | 156 | true 157 | ApiEnabled 158 | 159 | 160 | true 161 | AssignTopics 162 | 163 | 164 | true 165 | ChatterInternalUser 166 | 167 | 168 | true 169 | ChatterInviteExternalUsers 170 | 171 | 172 | true 173 | ChatterOwnGroups 174 | 175 | 176 | true 177 | ConvertLeads 178 | 179 | 180 | true 181 | CreateCustomizeFilters 182 | 183 | 184 | true 185 | CreateCustomizeReports 186 | 187 | 188 | true 189 | CreateTopics 190 | 191 | 192 | true 193 | DistributeFromPersWksp 194 | 195 | 196 | true 197 | EditEvent 198 | 199 | 200 | true 201 | EditOppLineItemUnitPrice 202 | 203 | 204 | true 205 | EditTask 206 | 207 | 208 | true 209 | EditTopics 210 | 211 | 212 | true 213 | EmailMass 214 | 215 | 216 | true 217 | EmailSingle 218 | 219 | 220 | true 221 | EnableNotifications 222 | 223 | 224 | true 225 | ExportReport 226 | 227 | 228 | true 229 | ImportPersonal 230 | 231 | 232 | true 233 | LightningConsoleAllowedForUser 234 | 235 | 236 | true 237 | ListEmailSend 238 | 239 | 240 | true 241 | ManageCases 242 | 243 | 244 | true 245 | ManageEncryptionKeys 246 | 247 | 248 | true 249 | ManageSolutions 250 | 251 | 252 | true 253 | RunReports 254 | 255 | 256 | true 257 | SelectFilesFromSalesforce 258 | 259 | 260 | true 261 | SendSitRequests 262 | 263 | 264 | true 265 | ShowCompanyNameAsUserBadge 266 | 267 | 268 | true 269 | SubmitMacrosAllowed 270 | 271 | 272 | true 273 | SubscribeToLightningReports 274 | 275 | 276 | true 277 | TransactionalEmailSend 278 | 279 | 280 | true 281 | TransferAnyCase 282 | 283 | 284 | true 285 | UseWebLink 286 | 287 | 288 | true 289 | ViewEventLogFiles 290 | 291 | 292 | true 293 | ViewHelpLink 294 | 295 | 296 | true 297 | ViewRoles 298 | 299 | 300 | true 301 | ViewSetup 302 | 303 | 304 | -------------------------------------------------------------------------------- /force-app/main/default/settings/Security.settings-meta.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AlphaNumeric 6 | NinetyDays 7 | 3 8 | FifteenMinutes 9 | TenAttempts 10 | 8 11 | false 12 | false 13 | DoesNotContainPassword 14 | 15 | 16 | false 17 | true 18 | true 19 | true 20 | true 21 | true 22 | false 23 | false 24 | true 25 | true 26 | false 27 | true 28 | true 29 | true 30 | false 31 | true 32 | true 33 | false 34 | false 35 | true 36 | true 37 | false 38 | true 39 | false 40 | true 41 | true 42 | false 43 | true 44 | true 45 | TwoHours 46 | 47 | 48 | -------------------------------------------------------------------------------- /manifest/package.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FabienHuot/KnowledgeSearch/6d9aa4c59cb850a3382e25d1865f0933139794e9/manifest/package.xml -------------------------------------------------------------------------------- /setupScratchOrg.cmd: -------------------------------------------------------------------------------- 1 | 2 | echo '##### CREATING SCRATCH ORG #####' 3 | call sfdx force:org:create -f config/project-scratch-def.json -a KnowledgeSearch -s 4 | echo '##### PUSHING METADATA #####' 5 | call sfdx force:source:push -u KnowledgeSearch 6 | echo '##### KNOWLEDGE PERMISSIONSET ASSIGNMENT #####' 7 | call sfdx force:user:permset:assign -n KnowledgeUser -u KnowledgeSearch 8 | call sfdx force:user:permset:assign -n KnowledgeAppUser -u KnowledgeSearch 9 | rem echo '##### CREATE KNOWLEDGE USER #####' 10 | rem sfdx force:user:create --setalias qa-user --definitionfile config/user-def.json 11 | echo '##### UPDATING USER USER WITH KNOWLEDGE LICENCE #####' 12 | call sfdx force:data:record:update -s User -w "Name='User User'" -v "UserPermissionsKnowledgeUser=true" 13 | echo '##### IMPORTING KNOWLEDGE DATA #####' 14 | call sfdx force:data:tree:import -f ./data/Knowledge__kav.json -u KnowledgeSearch 15 | echo '##### OPENING SCRATCH ORG #####' 16 | call sfdx force:org:open -------------------------------------------------------------------------------- /sfdx-project.json: -------------------------------------------------------------------------------- 1 | { 2 | "packageDirectories": [ 3 | { 4 | "path": "force-app", 5 | "default": true 6 | } 7 | ], 8 | "namespace": "", 9 | "sfdcLoginUrl": "https://login.salesforce.com", 10 | "sourceApiVersion": "45.0" 11 | } 12 | --------------------------------------------------------------------------------