Skip to content

Commit 30ea123

Browse files
authored
Merge branch 'main' into locfiles/ba0d2b9b-3073-4654-b746-cd788785eacd
2 parents eca889b + 360bc6c commit 30ea123

12 files changed

Lines changed: 105 additions & 33 deletions

File tree

src/client/extension.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ import { PacWrapper } from "./pac/PacWrapper";
5252
import { authenticateUserInVSCode } from "../common/services/AuthenticationProvider";
5353
import { PROVIDER_ID } from "../common/services/Constants";
5454
import { activateServerApiAutocomplete } from "../common/intellisense";
55-
import { EnableBLChanges } from "../common/ecs-features/ecsFeatureGates";
55+
import { EnableServerLogicChanges } from "../common/ecs-features/ecsFeatureGates";
5656
import { setServerApiTelemetryContext } from "../common/intellisense/ServerApiTelemetryContext";
5757

5858
let client: LanguageClient;
@@ -233,8 +233,8 @@ export async function activate(
233233
// Register copilot panels only after ECS initialization is complete
234234
registerCopilotPanels(pacWrapper);
235235

236-
const { enableBLChanges } = EnableBLChanges.getConfig() as { enableBLChanges?: boolean };
237-
if (!serverApiAutocompleteInitialized && enableBLChanges) {
236+
const { enableServerLogicChanges } = EnableServerLogicChanges.getConfig() as { enableServerLogicChanges?: boolean };
237+
if (!serverApiAutocompleteInitialized && enableServerLogicChanges) {
238238
// Set telemetry context for Server API autocomplete events
239239
setServerApiTelemetryContext({
240240
tenantId: TenantID,

src/common/ecs-features/ecsFeatureGates.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,12 @@ export const {
8181
});
8282

8383
export const {
84-
feature: EnableBLChanges
84+
feature: EnableServerLogicChanges
8585
} = getFeatureConfigs({
8686
teamName: PowerPagesClientName,
87-
description: 'Enable BL Changes in VSCode (web & desktop)',
87+
description: 'Enable Server Logic Changes in VSCode (web & desktop)',
8888
fallback: {
89-
enableBLChanges: false,
89+
enableServerLogicChanges: false,
9090
},
9191
})
9292

src/web/client/common/constants.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,3 +144,6 @@ export const WEB_EXTENSION_SEND_EMAIL_NOT_AVAILABLE = "Send email is not availab
144144
export const WEB_EXTENSION_QUICK_PICK_TITLE = "People on this file"
145145
export const WEB_EXTENSION_QUICK_PICK_PLACEHOLDER = "Search for people";
146146
export const WEB_EXTENSION_COLLABORATION_OPTIONS_CONTACT = "Contact";
147+
148+
//Business logic constants
149+
export const SERVERLOGICS = "server-logics";

src/web/client/dal/fileSystemProvider.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
PORTALS_URI_SCHEME,
1111
queryParameters,
1212
REFERRER,
13+
SERVERLOGICS,
1314
} from "../common/constants";
1415
import WebExtensionContext from "../WebExtensionContext";
1516
import { fetchDataFromDataverseAndUpdateVFS } from "./remoteFetchProvider";
@@ -33,6 +34,7 @@ import {
3334
import { getImageFileContent, getRangeForMultilineMatch, isImageFileSupportedForEdit, isPortalVersionV1, isVersionControlEnabled, updateFileContentInFileDataMap } from "../utilities/commonUtil";
3435
import { IFileInfo, ISearchQueryMatch, ISearchQueryResults } from "../common/interfaces";
3536
import { ERROR_CONSTANTS } from "../../../common/ErrorConstants";
37+
import { EnableServerLogicChanges } from "../../../common/ecs-features/ecsFeatureGates";
3638

3739
export class File implements vscode.FileStat {
3840
type: vscode.FileType;
@@ -225,12 +227,16 @@ export class PortalsFS implements vscode.FileSystemProvider {
225227
async createDirectory(uri: vscode.Uri): Promise<void> {
226228
// Do silent lookup to check for existing entry
227229
const entry = await this._lookup(uri, true);
228-
230+
const { enableServerLogicChanges } = EnableServerLogicChanges.getConfig() as { enableServerLogicChanges?: boolean };
229231
if (!entry) {
230232
const basename = path.posix.basename(uri.path);
231233
const dirname = uri.with({ path: path.posix.dirname(uri.path) });
232234
const parent = await this._lookupAsDirectory(dirname, false);
233235

236+
if (basename === SERVERLOGICS && !enableServerLogicChanges) {
237+
return; // Do not create the directory if the server logic is disabled
238+
}
239+
234240
const entry = new Directory(basename);
235241
parent.entries.set(entry.name, entry);
236242
parent.mtime = Date.now();

src/web/client/dal/remoteFetchProvider.ts

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import { IAttributePath, IFileInfo } from "../common/interfaces";
3535
import { portal_schema_V2 } from "../schema/portalSchema";
3636
import { ERROR_CONSTANTS } from "../../../common/ErrorConstants";
3737
import { showErrorDialog } from "../../../common/utilities/errorHandlerUtil";
38+
import { EnableServerLogicChanges } from "../../../common/ecs-features/ecsFeatureGates";
3839

3940
export async function fetchDataFromDataverseAndUpdateVFS(
4041
portalFs: PortalsFS,
@@ -48,18 +49,21 @@ export async function fetchDataFromDataverseAndUpdateVFS(
4849
const dataverseOrgUrl = WebExtensionContext.urlParametersMap.get(
4950
Constants.queryParameters.ORG_URL
5051
) as string;
52+
const { enableServerLogicChanges } = EnableServerLogicChanges.getConfig() as { enableServerLogicChanges?: boolean };
5153
await Promise.all(entityRequestURLs.map(async (entity) => {
5254
const startTime = new Date().getTime();
53-
await fetchFromDataverseAndCreateFiles(entity.entityName, entity.requestUrl, dataverseOrgUrl, portalFs, defaultFileInfo);
54-
55-
if (defaultFileInfo === undefined) { // This will be undefined for bulk entity load
56-
WebExtensionContext.telemetry.sendInfoTelemetry(
57-
webExtensionTelemetryEventNames.WEB_EXTENSION_FILES_LOAD_SUCCESS,
58-
{
59-
entityName: entity.entityName,
60-
duration: (new Date().getTime() - startTime).toString(),
61-
}
62-
);
55+
if(entity.entityName != schemaEntityName.SERVERLOGICS || enableServerLogicChanges) {
56+
await fetchFromDataverseAndCreateFiles(entity.entityName, entity.requestUrl, dataverseOrgUrl, portalFs, defaultFileInfo);
57+
58+
if (defaultFileInfo === undefined) { // This will be undefined for bulk entity load
59+
WebExtensionContext.telemetry.sendInfoTelemetry(
60+
webExtensionTelemetryEventNames.WEB_EXTENSION_FILES_LOAD_SUCCESS,
61+
{
62+
entityName: entity.entityName,
63+
duration: (new Date().getTime() - startTime).toString(),
64+
}
65+
);
66+
}
6367
}
6468
}));
6569
} catch (error) {
@@ -595,6 +599,10 @@ async function fetchMappingEntityContent(
595599
headers: getCommonHeadersForDataverse(accessToken),
596600
});
597601

602+
if(entity === schemaEntityName.SERVERLOGICS && !response.ok) {
603+
return Constants.NO_CONTENT;
604+
}
605+
598606
if (!response.ok) {
599607
WebExtensionContext.telemetry.sendAPIFailureTelemetry(
600608
requestUrl,
@@ -619,6 +627,10 @@ async function fetchMappingEntityContent(
619627

620628
const result = await response.json();
621629
const data = result.value ?? result;
630+
631+
if(entity === schemaEntityName.SERVERLOGICS) {
632+
return data || Constants.NO_CONTENT;
633+
}
622634
if (isPortalVersionV1() && result[Constants.ODATA_COUNT] > 0 && data.length > 0) {
623635
return data[0];
624636
}

src/web/client/dal/remoteSaveProvider.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { getPatchRequestUrl, getRequestURL } from "../utilities/urlBuilderUtil";
1919
import WebExtensionContext from "../WebExtensionContext";
2020
import { IAttributePath } from "../common/interfaces";
2121
import { webExtensionTelemetryEventNames } from "../../../common/OneDSLoggerTelemetry/web/client/webExtensionTelemetryEvents";
22-
import { schemaEntityKey } from "../schema/constants";
22+
import { MultiFileSupportedEntityName, schemaEntityKey } from "../schema/constants";
2323
import { getEntityMappingEntityId } from "../utilities/fileAndEntityUtil";
2424

2525
interface ISaveCallParameters {
@@ -92,10 +92,14 @@ async function getSaveParameters(
9292
useOctetStreamContentType(entityName, attributePath.source)
9393
);
9494
if (webFileV2) {
95+
let fileName = fileDataMap.get(fileUri.fsPath)?.fileName as string;
96+
if (entityName === MultiFileSupportedEntityName.SERVERLOGICS && fileName && !fileName.endsWith('.sl')) {
97+
const baseName = fileName.endsWith('.js') ? fileName.slice(0, -3) : fileName;
98+
fileName = `${baseName}.sl`;
99+
}
95100
saveCallParameters.requestInit.headers = {
96101
...saveCallParameters.requestInit.headers,
97-
"x-ms-file-name": fileDataMap.get(fileUri.fsPath)
98-
?.fileName as string,
102+
"x-ms-file-name": fileName,
99103
};
100104
}
101105

@@ -157,9 +161,12 @@ async function saveDataToDataverse(
157161
const entityName = fileDataMap.get(fileUri.fsPath)
158162
?.entityName as string;
159163
const requestSentAtTime = new Date().getTime();
160-
const fileExtensionType = fileDataMap.get(
164+
let fileExtensionType = fileDataMap.get(
161165
fileUri.fsPath
162166
)?.entityFileExtensionType;
167+
if(entityName == MultiFileSupportedEntityName.SERVERLOGICS ) {
168+
fileExtensionType = 'sl';
169+
}
163170

164171
try {
165172
WebExtensionContext.telemetry.sendAPITelemetry(

src/web/client/extension.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ import { EXTENSION_ID } from "../../common/constants";
4545
import { getECSOrgLocationValue } from "../../common/utilities/Utils";
4646
import { authenticateUserInVSCode } from "../../common/services/AuthenticationProvider";
4747
import { activateServerApiAutocomplete } from "../../common/intellisense";
48-
import { EnableBLChanges } from "../../common/ecs-features/ecsFeatureGates";
48+
import { EnableServerLogicChanges } from "../../common/ecs-features/ecsFeatureGates";
4949
import { setServerApiTelemetryContext } from "../../common/intellisense/ServerApiTelemetryContext";
5050

5151
let serverApiAutocompleteInitialized = false;
@@ -139,8 +139,6 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
139139
title: vscode.l10n.t("Fetching your file ..."),
140140
},
141141
async () => {
142-
await portalsFS.readDirectory(WebExtensionContext.rootDirectory, true);
143-
144142
// Initialize ECS config in webExtensionContext
145143
await ECSFeaturesClient.init(
146144
{
@@ -152,9 +150,11 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
152150
Location: queryParamsMap.get(queryParameters.GEO) as string
153151
},
154152
PowerPagesClientName);
153+
154+
await portalsFS.readDirectory(WebExtensionContext.rootDirectory, true);
155155

156-
const { enableBLChanges } = EnableBLChanges.getConfig() as { enableBLChanges?: boolean };
157-
if (!serverApiAutocompleteInitialized && enableBLChanges) {
156+
const { enableServerLogicChanges } = EnableServerLogicChanges.getConfig() as { enableServerLogicChanges?: boolean };
157+
if (!serverApiAutocompleteInitialized && enableServerLogicChanges) {
158158
// Set telemetry context for Server API autocomplete events
159159
setServerApiTelemetryContext({
160160
tenantId: queryParamsMap.get(queryParameters.TENANT_ID) as string,

src/web/client/schema/constants.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export enum schemaEntityName {
4747
WEBFILES = "webfiles",
4848
WEBPAGES = "webpages",
4949
WEBTEMPLATES = "webtemplates",
50+
SERVERLOGICS = "serverlogics",
5051
CONTENTSNIPPETS = "contentsnippet",
5152
LISTS = "lists",
5253
BASICFORMS = "basicforms",
@@ -57,6 +58,7 @@ export enum schemaEntityName {
5758
export enum MultiFileSupportedEntityName {
5859
WEBFILES = "webfiles",
5960
WEBPAGES = "webpages",
61+
SERVERLOGICS = "serverlogics",
6062
WEBTEMPLATES = "webtemplates",
6163
CONTENTSNIPPETS = "contentsnippet",
6264
LISTS = "lists",

src/web/client/schema/portalSchema.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,26 @@ export const portal_schema_V1 = {
107107
["documentbody", "?$filter=_objectid_value eq {entityId} &$select=mimetype,documentbody,filename,annotationid,_objectid_value &$count=true &$orderby=modifiedon desc"],
108108
]),
109109
},
110+
{
111+
relationships: "",
112+
_vscodeentityname: "serverlogics",
113+
_dataverseenityname: "adx_serverlogics",
114+
_displayname: "Server Logic",
115+
_etc: "11398",
116+
_primaryidfield: "adx_serverlogicid",
117+
_primarynamefield: "name",
118+
_disableplugins: "true",
119+
_foldername: "server-logics",
120+
_exporttype: "SingleFolder",
121+
_fetchQueryParameters:
122+
"?$filter=adx_serverlogicid eq {entityId} &$select=name",
123+
_multiFileFetchQueryParameters: "?$filter=_website_value eq {websiteId} &$select=adx_serverlogicid,name,filecontent&$count=true",
124+
_attributes: "filecontent",
125+
_attributesExtension: new Map([["filecontent", "js"]]),
126+
_mappingEntityFetchQuery: new Map([
127+
["filecontent", "({entityId})/filecontent"],
128+
]),
129+
},
110130
{
111131
relationships: "",
112132
_vscodeentityname: "contentsnippet",
@@ -319,6 +339,27 @@ export const portal_schema_V2 = {
319339
["filecontent", "({entityId})/filecontent"],
320340
]),
321341
},
342+
{
343+
relationships: "",
344+
_vscodeentityname: "serverlogics",
345+
_dataverseenityname: "powerpagecomponents",
346+
_displayname: "Server Logic",
347+
_etc: "10271",
348+
_primaryidfield: "powerpagecomponentid",
349+
_primarynamefield: "name",
350+
_disableplugins: "false",
351+
_exporttype: "SingleFolder",
352+
_foldername: "server-logics",
353+
_fetchQueryParameters:
354+
"?$filter=powerpagecomponentid eq {entityId}&$select=name",
355+
_multiFileFetchQueryParameters:
356+
"?$filter=_powerpagesiteid_value eq {websiteId} and powerpagecomponenttype eq 35 &$select=name,content,_powerpagesitelanguageid_value&$count=true",
357+
_attributes: "filecontent",
358+
_attributesExtension: new Map([["filecontent", "js"]]),
359+
_mappingEntityFetchQuery: new Map([
360+
["filecontent", "({entityId})/filecontent"],
361+
]),
362+
},
322363
{
323364
relationships: "",
324365
_vscodeentityname: "contentsnippet",

src/web/client/utilities/commonUtil.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ export function isExtensionNeededInFileName(entity: string) {
6363
|| entity === schemaEntityName.ADVANCEDFORMSTEPS
6464
|| entity === schemaEntityName.BASICFORMS
6565
|| entity === schemaEntityName.WEBPAGES
66-
|| entity === schemaEntityName.CONTENTSNIPPETS;
66+
|| entity === schemaEntityName.CONTENTSNIPPETS
67+
|| entity === schemaEntityName.SERVERLOGICS;
6768
}
6869

6970
// eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -192,7 +193,7 @@ export function getFileExtension(fileName: string): string | undefined {
192193
}
193194

194195
export function getFileExtensionForPreload() {
195-
return ['css', 'json', 'txt'];
196+
return ['css', 'json', 'txt', 'js'];
196197
}
197198

198199
export function getImageContent(mimeType: string, fileContent: string) {

0 commit comments

Comments
 (0)