From 436268b04d09465dbca0807466935194ae16191a Mon Sep 17 00:00:00 2001 From: "msftbot[bot]" <48340428+msftbot[bot]@users.noreply.github.com> Date: Tue, 28 Jun 2022 23:42:40 +0000 Subject: [PATCH 1/2] Add `.github/fabricbot.json` --- .github/fabricbot.json | 969 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 969 insertions(+) create mode 100644 .github/fabricbot.json diff --git a/.github/fabricbot.json b/.github/fabricbot.json new file mode 100644 index 000000000..2b7ddd50a --- /dev/null +++ b/.github/fabricbot.json @@ -0,0 +1,969 @@ +{ + "version": "1.0", + "tasks": [ + { + "taskType": "trigger", + "capabilityId": "IssueResponder", + "subCapability": "IssueResponder", + "version": "1.0", + "config": { + "conditions": { + "operator": "and", + "operands": [ + { + "name": "isEvent", + "parameters": { + "eventName": "issues" + } + }, + { + "name": "isAction", + "parameters": { + "action": "opened" + } + }, + { + "operator": "not", + "operands": [ + { + "name": "isAssignedToSomeone", + "parameters": {} + } + ] + } + ] + }, + "taskName": "Auto-label incoming issues as Needs Triage", + "actions": [ + { + "name": "addReply", + "parameters": { + "comment": "Thank you for reporting this issue. We will be triaging your incoming issue as soon as possible." + } + }, + { + "name": "addLabels", + "parameters": { + "labels": [ + "Needs: Triage :mag:" + ] + } + } + ] + }, + "id": "S8cvWhK2U" + }, + { + "taskType": "trigger", + "capabilityId": "IssueResponder", + "subCapability": "IssueResponder", + "version": "1.0", + "config": { + "conditions": { + "operator": "and", + "operands": [ + { + "operator": "not", + "operands": [ + { + "name": "isActivitySender", + "parameters": { + "user": "msft-github-bot" + } + } + ] + }, + { + "operator": "not", + "operands": [ + { + "name": "isAction", + "parameters": { + "action": "closed" + } + } + ] + }, + { + "name": "hasLabel", + "parameters": { + "label": "no-recent-activity" + } + } + ] + }, + "taskName": "Remove no recent activity label", + "actions": [ + { + "name": "removeLabel", + "parameters": { + "label": "no-recent-activity" + } + } + ] + }, + "id": "SLvawtEOB8" + }, + { + "taskType": "trigger", + "capabilityId": "IssueResponder", + "subCapability": "IssueResponder", + "version": "1.0", + "config": { + "conditions": { + "operator": "and", + "operands": [ + { + "name": "isEvent", + "parameters": { + "eventName": "issue_comment" + } + }, + { + "name": "isIssue", + "parameters": {} + }, + { + "name": "isActivitySender", + "parameters": { + "user": { + "type": "author" + } + } + }, + { + "name": "hasLabel", + "parameters": { + "label": "Needs: Author Feedback" + } + } + ] + }, + "taskName": "Add needs attention label to issues", + "actions": [ + { + "name": "addLabels", + "parameters": { + "labels": [ + "Needs: Attention :wave:" + ] + } + } + ] + }, + "id": "C6UytYRSlR" + }, + { + "taskType": "trigger", + "capabilityId": "IssueResponder", + "subCapability": "IssueResponder", + "version": "1.0", + "config": { + "conditions": { + "operator": "and", + "operands": [ + { + "name": "isActivitySender", + "parameters": { + "user": { + "type": "author" + } + } + }, + { + "operator": "not", + "operands": [ + { + "name": "isAction", + "parameters": { + "action": "closed" + } + } + ] + }, + { + "name": "hasLabel", + "parameters": { + "label": "Needs: Author Feedback" + } + } + ] + }, + "taskName": "Remove needs author feedback label from issues and pull requests", + "actions": [ + { + "name": "removeLabel", + "parameters": { + "label": "Needs: Author Feedback" + } + } + ] + }, + "id": "NoGMSCt3JK" + }, + { + "taskType": "scheduled", + "capabilityId": "ScheduledSearch", + "subCapability": "ScheduledSearch", + "version": "1.0", + "config": { + "taskName": "Close stale issues", + "frequency": [ + { + "weekDay": 0, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + }, + { + "weekDay": 1, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + }, + { + "weekDay": 2, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + }, + { + "weekDay": 3, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + }, + { + "weekDay": 4, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + }, + { + "weekDay": 5, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + }, + { + "weekDay": 6, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + } + ], + "searchTerms": [ + { + "name": "isIssue", + "parameters": {} + }, + { + "name": "isOpen", + "parameters": {} + }, + { + "name": "hasLabel", + "parameters": { + "label": "Needs: Author Feedback" + } + }, + { + "name": "hasLabel", + "parameters": { + "label": "no-recent-activity" + } + }, + { + "name": "noActivitySince", + "parameters": { + "days": 7 + } + } + ], + "actions": [ + { + "name": "closeIssue", + "parameters": {} + }, + { + "name": "addReply", + "parameters": { + "comment": "Closing issue due no response from original author. If this issue is still occurring, please open a new issue with additional details. Notice that if you have included another related issue as additional comment on this, please open that also as separate issue, so that we can track it independently. " + } + } + ] + }, + "id": "xNk7Qt-p7h" + }, + { + "taskType": "scheduled", + "capabilityId": "ScheduledSearch", + "subCapability": "ScheduledSearch", + "version": "1.0", + "config": { + "frequency": [ + { + "weekDay": 0, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + }, + { + "weekDay": 1, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + }, + { + "weekDay": 2, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + }, + { + "weekDay": 3, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + }, + { + "weekDay": 4, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + }, + { + "weekDay": 5, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + }, + { + "weekDay": 6, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + } + ], + "searchTerms": [ + { + "name": "isIssue", + "parameters": {} + }, + { + "name": "isOpen", + "parameters": {} + }, + { + "name": "hasLabel", + "parameters": { + "label": "Needs: Author Feedback" + } + }, + { + "name": "noActivitySince", + "parameters": { + "days": 7 + } + }, + { + "name": "noLabel", + "parameters": { + "label": "no-recent-activity" + } + } + ], + "actions": [ + { + "name": "addLabels", + "parameters": { + "labels": [ + "no-recent-activity" + ] + } + }, + { + "name": "addReply", + "parameters": { + "comment": "This issue has been automatically marked as stale because it has marked as requiring author feedback but has not had any activity for **7 days**. It will be closed if no further activity occurs **within next 7 days of this comment**. Thank you for your contributions to SharePoint Developer activities." + } + } + ], + "taskName": "Mark issue with no-recent-activity label if there's no actions in 7 days" + }, + "id": "JFtYOd377Y" + }, + { + "taskType": "scheduled", + "capabilityId": "ScheduledSearch", + "subCapability": "ScheduledSearch", + "version": "1.1", + "config": { + "taskName": "Closed answered issues in 7 days", + "frequency": [ + { + "weekDay": 0, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + }, + { + "weekDay": 1, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + }, + { + "weekDay": 2, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + }, + { + "weekDay": 3, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + }, + { + "weekDay": 4, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + }, + { + "weekDay": 5, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + }, + { + "weekDay": 6, + "hours": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23 + ] + } + ], + "searchTerms": [ + { + "name": "isIssue", + "parameters": {} + }, + { + "name": "isOpen", + "parameters": {} + }, + { + "name": "hasLabel", + "parameters": { + "label": "status:answered" + } + }, + { + "name": "noActivitySince", + "parameters": { + "days": 3 + } + } + ], + "actions": [ + { + "name": "closeIssue", + "parameters": {} + }, + { + "name": "addReply", + "parameters": { + "comment": "Closing issue as \"answered\". If you encounter similar issue(s), please open up a NEW issue. Thank you." + } + } + ] + }, + "id": "CMJH49c4u_" + } + ], + "userGroups": [] +} From 811259dac02e7512fc131e9e8a01568fda8e00e6 Mon Sep 17 00:00:00 2001 From: Paolo Pialorsi Date: Thu, 8 Sep 2022 17:09:22 +0200 Subject: [PATCH 2/2] Added support for hidden fields in DynamicForm control --- CHANGELOG.json | 12 + src/controls/dynamicForm/DynamicForm.tsx | 290 +++++++++--------- src/controls/dynamicForm/IDynamicFormProps.ts | 6 + 3 files changed, 165 insertions(+), 143 deletions(-) diff --git a/CHANGELOG.json b/CHANGELOG.json index 8a5ad532a..efaf0fc70 100644 --- a/CHANGELOG.json +++ b/CHANGELOG.json @@ -1,5 +1,17 @@ { "versions": [ + { + "version": "3.11.0", + "changes": { + "new": [], + "enhancements": [ + "`Dynamic Form`: Allow to hide fields [#1307](https://github.com/pnp/sp-dev-fx-controls-react/pull/1307)" + ] + }, + "contributions": [ + "[Paolo Pialorsi](https://github.com/PaoloPia)" + ] + }, { "version": "3.10.0", "changes": { diff --git a/src/controls/dynamicForm/DynamicForm.tsx b/src/controls/dynamicForm/DynamicForm.tsx index d4c585001..abdee0416 100644 --- a/src/controls/dynamicForm/DynamicForm.tsx +++ b/src/controls/dynamicForm/DynamicForm.tsx @@ -331,168 +331,172 @@ export class DynamicForm extends React.Component { - choices.push({ key: element, text: element }); - }); - } - else if (fieldType === "Note") { - richText = field.RichText; - } - else if (fieldType === "Lookup") { - lookupListId = field.LookupList; - lookupField = field.LookupField; - if (item !== null) { - defaultValue = await this._spService.getLookupValue(listId, listItemId, field.EntityPropertyName, lookupField, this.webURL); - } - else { - defaultValue = []; - } - } - else if (fieldType === "LookupMulti") { - lookupListId = field.LookupList; - lookupField = field.LookupField; + // Handle only fields that are not marked as hidden + if (this.props.hiddenFields.indexOf(field.EntityPropertyName) < 0) { + order++; + const fieldType = field.TypeAsString; + field.order = order; + let hiddenName = ""; + let termSetId = ""; + let lookupListId = ""; + let lookupField = ""; + const choices: IDropdownOption[] = []; + let defaultValue = null; + const selectedTags: any = []; // eslint-disable-line @typescript-eslint/no-explicit-any + let richText = false; + let dateFormat: DateFormat | undefined; + let principalType = ""; if (item !== null) { - defaultValue = await this._spService.getLookupValues(listId, listItemId, field.EntityPropertyName, lookupField, this.webURL); + defaultValue = item[field.EntityPropertyName]; } else { - defaultValue = []; + defaultValue = field.DefaultValue; } - } - else if (fieldType === "TaxonomyFieldTypeMulti") { - const response = await this._spService.getTaxonomyFieldInternalName(this.props.listId, field.InternalName, this.webURL); - hiddenName = response.value; - termSetId = field.TermSetId; - if (item !== null) { - item[field.InternalName].forEach(element => { - selectedTags.push({ key: element.TermGuid, name: element.Label }); + if (fieldType === 'Choice' || fieldType === 'MultiChoice') { + field.Choices.forEach(element => { + choices.push({ key: element, text: element }); }); - - defaultValue = selectedTags; } - else { - if (defaultValue !== "") { - defaultValue.split(/#|;/).forEach(element => { - if (element.indexOf('|') !== -1) - selectedTags.push({ key: element.split('|')[1], name: element.split('|')[0] }); - }); - - defaultValue = selectedTags; + else if (fieldType === "Note") { + richText = field.RichText; + } + else if (fieldType === "Lookup") { + lookupListId = field.LookupList; + lookupField = field.LookupField; + if (item !== null) { + defaultValue = await this._spService.getLookupValue(listId, listItemId, field.EntityPropertyName, lookupField, this.webURL); + } + else { + defaultValue = []; } + } - if (defaultValue === "") - defaultValue = null; - } - else if (fieldType === "TaxonomyFieldType") { - - termSetId = field.TermSetId; - if (item !== null) { - const response = await this._spService.getSingleManagedMtadataLabel(listId, listItemId, field.InternalName); - if (response) { - selectedTags.push({ key: response.TermID, name: response.Label }); - defaultValue = selectedTags; + else if (fieldType === "LookupMulti") { + lookupListId = field.LookupList; + lookupField = field.LookupField; + if (item !== null) { + defaultValue = await this._spService.getLookupValues(listId, listItemId, field.EntityPropertyName, lookupField, this.webURL); + } + else { + defaultValue = []; } } - else { - if (defaultValue !== "") { - selectedTags.push({ key: defaultValue.split('|')[1], name: defaultValue.split('|')[0].split('#')[1] }); + else if (fieldType === "TaxonomyFieldTypeMulti") { + const response = await this._spService.getTaxonomyFieldInternalName(this.props.listId, field.InternalName, this.webURL); + hiddenName = response.value; + termSetId = field.TermSetId; + if (item !== null) { + item[field.InternalName].forEach(element => { + selectedTags.push({ key: element.TermGuid, name: element.Label }); + }); + defaultValue = selectedTags; } + else { + if (defaultValue !== "") { + defaultValue.split(/#|;/).forEach(element => { + if (element.indexOf('|') !== -1) + selectedTags.push({ key: element.split('|')[1], name: element.split('|')[0] }); + }); + + defaultValue = selectedTags; + } + } + if (defaultValue === "") + defaultValue = null; } - if (defaultValue === "") - defaultValue = null; - } - else if (fieldType === "DateTime") { - if (item !== null && item[field.InternalName]) - defaultValue = new Date(item[field.InternalName]); - else if (defaultValue === '[today]') { - defaultValue = new Date(); - } - - const schemaXml = field.SchemaXml; - const dateFormatRegEx = /\s+Format="([^"]+)"/gmi.exec(schemaXml); - dateFormat = dateFormatRegEx && dateFormatRegEx.length ? dateFormatRegEx[1] as DateFormat : 'DateOnly'; - - } - else if (fieldType === "UserMulti") { - if (item !== null) - defaultValue = await this._spService.getUsersUPNFromFieldValue(listId, listItemId, field.InternalName, this.webURL); - else { - defaultValue = []; + else if (fieldType === "TaxonomyFieldType") { + + termSetId = field.TermSetId; + if (item !== null) { + const response = await this._spService.getSingleManagedMtadataLabel(listId, listItemId, field.InternalName); + if (response) { + selectedTags.push({ key: response.TermID, name: response.Label }); + defaultValue = selectedTags; + } + } + else { + if (defaultValue !== "") { + selectedTags.push({ key: defaultValue.split('|')[1], name: defaultValue.split('|')[0].split('#')[1] }); + defaultValue = selectedTags; + } + } + if (defaultValue === "") + defaultValue = null; + } + else if (fieldType === "DateTime") { + if (item !== null && item[field.InternalName]) + defaultValue = new Date(item[field.InternalName]); + else if (defaultValue === '[today]') { + defaultValue = new Date(); + } + + const schemaXml = field.SchemaXml; + const dateFormatRegEx = /\s+Format="([^"]+)"/gmi.exec(schemaXml); + dateFormat = dateFormatRegEx && dateFormatRegEx.length ? dateFormatRegEx[1] as DateFormat : 'DateOnly'; + } - principalType = field.SchemaXml.split('UserSelectionMode="')[1]; - principalType = principalType.substring(0, principalType.indexOf('"')); - } - else if (fieldType === "Thumbnail") { - if (defaultValue !== null) { - defaultValue = this.webURL.split('/sites/')[0] + JSON.parse(defaultValue).serverRelativeUrl; + else if (fieldType === "UserMulti") { + if (item !== null) + defaultValue = await this._spService.getUsersUPNFromFieldValue(listId, listItemId, field.InternalName, this.webURL); + else { + defaultValue = []; + } + principalType = field.SchemaXml.split('UserSelectionMode="')[1]; + principalType = principalType.substring(0, principalType.indexOf('"')); } - } - else if (fieldType === "User") { - if (item !== null) { - const userEmails: string[] = []; - userEmails.push(await this._spService.getUserUPNById(parseInt(item[field.InternalName + "Id"])) + ''); - defaultValue = userEmails; + else if (fieldType === "Thumbnail") { + if (defaultValue !== null) { + defaultValue = this.webURL.split('/sites/')[0] + JSON.parse(defaultValue).serverRelativeUrl; + } } - else { - defaultValue = []; + else if (fieldType === "User") { + if (item !== null) { + const userEmails: string[] = []; + userEmails.push(await this._spService.getUserUPNById(parseInt(item[field.InternalName + "Id"])) + ''); + defaultValue = userEmails; + } + else { + defaultValue = []; + } + principalType = field.SchemaXml.split('UserSelectionMode="')[1]; + principalType = principalType.substring(0, principalType.indexOf('"')); } - principalType = field.SchemaXml.split('UserSelectionMode="')[1]; - principalType = principalType.substring(0, principalType.indexOf('"')); - } - else if (fieldType === "Location") { - defaultValue = JSON.parse(defaultValue); - } - else if (fieldType === "Boolean") { - defaultValue = Boolean(Number(defaultValue)); + else if (fieldType === "Location") { + defaultValue = JSON.parse(defaultValue); + } + else if (fieldType === "Boolean") { + defaultValue = Boolean(Number(defaultValue)); + } + + tempFields.push({ + newValue: null, + fieldTermSetId: termSetId, + options: choices, + lookupListID: lookupListId, + lookupField: lookupField, + changedValue: defaultValue, + fieldType: field.TypeAsString, + fieldTitle: field.Title, + fieldDefaultValue: defaultValue, + context: this.props.context, + disabled: this.props.disabled || (disabledFields && disabledFields.indexOf(field.InternalName) > -1), + listId: this.props.listId, + columnInternalName: field.EntityPropertyName, + label: field.Title, + onChanged: this.onChange, + required: field.Required, + hiddenFieldName: hiddenName, + Order: field.order, + isRichText: richText, + dateFormat: dateFormat, + listItemId: listItemId, + principalType: principalType, + description: field.Description + }); + tempFields.sort((a, b) => a.Order - b.Order); } - - tempFields.push({ - newValue: null, - fieldTermSetId: termSetId, - options: choices, - lookupListID: lookupListId, - lookupField: lookupField, - changedValue: defaultValue, - fieldType: field.TypeAsString, - fieldTitle: field.Title, - fieldDefaultValue: defaultValue, - context: this.props.context, - disabled: this.props.disabled || (disabledFields && disabledFields.indexOf(field.InternalName) > -1), - listId: this.props.listId, - columnInternalName: field.EntityPropertyName, - label: field.Title, - onChanged: this.onChange, - required: field.Required, - hiddenFieldName: hiddenName, - Order: field.order, - isRichText: richText, - dateFormat: dateFormat, - listItemId: listItemId, - principalType: principalType, - description: field.Description - }); - tempFields.sort((a, b) => a.Order - b.Order); } this.setState({ fieldCollection: tempFields }); diff --git a/src/controls/dynamicForm/IDynamicFormProps.ts b/src/controls/dynamicForm/IDynamicFormProps.ts index 2577a8327..6f116ccea 100644 --- a/src/controls/dynamicForm/IDynamicFormProps.ts +++ b/src/controls/dynamicForm/IDynamicFormProps.ts @@ -55,11 +55,17 @@ export interface IDynamicFormProps { * Used to execute WebSearch. If not provided SearchTab will not be available. */ //bingAPIKey?: string; + /** * InternalName of fields that should be disabled */ disabledFields?: string[]; + /** + * InternalName of fields that should be hidden + */ + hiddenFields?: string[]; + /** * Absolute Web Url of target site (user requires permissions) * */