From a82dbe4d05dd59e1d86d36fa88fd6779b201a61b Mon Sep 17 00:00:00 2001 From: Sebastian Muthwill Date: Sat, 16 Oct 2021 22:20:14 +0200 Subject: [PATCH 1/4] fix: arranges the screenorder based on CanvasManifest file and adds exclude screen to config --- config.yaml | 5 ++ powerapps_docstring/documentation.py | 70 +++++++++++++++------------- powerapps_docstring/parser.py | 5 +- 3 files changed, 45 insertions(+), 35 deletions(-) diff --git a/config.yaml b/config.yaml index 0738c71..525099d 100644 --- a/config.yaml +++ b/config.yaml @@ -15,3 +15,8 @@ RelevantObjects: screen: [OnVisible] text: [OnSelect] #typedDataCard: [DataField, Default, Update] + +ScreenFlow: + # By default all screens from CanvasManifest.json will be used in same sequence. + # If screens shall be excluded from the graph, list them here. + ExcludeScreens: [] \ No newline at end of file diff --git a/powerapps_docstring/documentation.py b/powerapps_docstring/documentation.py index e3e8a4e..7ed066d 100644 --- a/powerapps_docstring/documentation.py +++ b/powerapps_docstring/documentation.py @@ -12,16 +12,21 @@ def __init__(self, source, output, config) -> None: self.output_path = output self.parser = Parser(self.source_path) self.config = config + self.manifest_file = self.parser.get_canvas_manifest() self.relevant_objects = self.config["RelevantObjects"] self.relevant_object_keys = [f" As {x}" for x in self.relevant_objects.keys()] def _get_screen_files(self): screen_files = [] screens_path = self.source_path + "/Src/" - for file in os.listdir(screens_path): - if os.path.isfile(screens_path + file) & file.endswith(".yaml"): - if file != "App.fx.yaml": - screen_files.append(file) + + # read screen order from manifest and check if files exists + screen_order = self.manifest_file["ScreenOrder"] + for screen in screen_order: + screen_file_name = screen + ".fx.yaml" + if screen_file_name in os.listdir(screens_path): + if screen_file_name != "App.fx.yaml": + screen_files.append(screen_file_name) return screen_files @@ -119,29 +124,32 @@ def get_recursively(search_dict, field): screen_files = self._get_screen_files() screens_path = self.source_path + "/Src/" + for screen in screen_files: - screen_obj = self.parser.get_screen_objects(screen) - from_screen = screen_obj[0] - list_of_onselects = get_recursively(screen_obj[1], "OnSelect") - - for item in list_of_onselects: - if "Navigate(" in item: - - item = item.strip().replace("\n", "").replace("\t", "").replace(" ", "") - navigate_occurences = [m.start() for m in re.finditer('Navigate\(', item)] - - for occurence in navigate_occurences: - #print(occurence) - start = occurence + len("Navigate(") - #print(start) - end = item[start:].find(",") - if end == -1: - end = item[start:].find(")") - end = end + start - to_screen = item[start:end] - if to_screen != None and to_screen != "" and not to_screen.startswith("[@"): - to_screen = to_screen.replace("\n", "").replace("\t", "").replace(" ", "").replace(")", "") - screenflow_list.append(from_screen + " ==> " + to_screen.replace("\n", "").replace("\t", "").replace(" ", "")) + # check if screen has been excluded + if screen.replace(".fx.yaml", "") not in self.config["ScreenFlow"]["ExcludeScreens"]: + screen_obj = self.parser.get_screen_objects(screen) + from_screen = screen_obj[0] + list_of_onselects = get_recursively(screen_obj[1], "OnSelect") + + for item in list_of_onselects: + if "Navigate(" in item: + + item = item.strip().replace("\n", "").replace("\t", "").replace(" ", "") + navigate_occurences = [m.start() for m in re.finditer('Navigate\(', item)] + + for occurence in navigate_occurences: + #print(occurence) + start = occurence + len("Navigate(") + #print(start) + end = item[start:].find(",") + if end == -1: + end = item[start:].find(")") + end = end + start + to_screen = item[start:end] + if to_screen != None and to_screen != "" and not to_screen.startswith("[@") and to_screen not in self.config["ScreenFlow"]["ExcludeScreens"]: + to_screen = to_screen.replace("\n", "").replace("\t", "").replace(" ", "").replace(")", "") + screenflow_list.append(from_screen + " ==> " + to_screen.replace("\n", "").replace("\t", "").replace(" ", "")) #print(screenflow_list) @@ -158,7 +166,7 @@ def create_documentation(self, format=None): # instantiate the md file # TODO: get title from docstring variable - app_name = self.parser.get_app_name() + app_name = self.manifest_file["PublishInfo"]["AppName"] self.md_file = MdUtils(file_name=self.output_path + f'/{app_name}-doc', title='Power App Documentation') @@ -215,11 +223,9 @@ def create_documentation(self, format=None): # loop thru all screens and create markdown screens_path = self.source_path + "/Src/" - for file in os.listdir(screens_path): - if os.path.isfile(screens_path + file) & file.endswith(".yaml"): - if file != "App.fx.yaml": - screen_objects = self.parser.get_screen_objects(file) - self._extract_screen_content_to_markdown(screen_objects) + for file in self._get_screen_files(): + screen_objects = self.parser.get_screen_objects(file) + self._extract_screen_content_to_markdown(screen_objects) # write toc + file self.md_file.new_table_of_contents(table_title='Contents', depth=2) diff --git a/powerapps_docstring/parser.py b/powerapps_docstring/parser.py index 0c852a1..b0bdd64 100644 --- a/powerapps_docstring/parser.py +++ b/powerapps_docstring/parser.py @@ -34,12 +34,11 @@ def get_screen_objects(self, screen_name) -> tuple: screen_name = list(screen_content.keys())[0].split(" ")[0] return screen_name, screen_content - def get_app_name(self): + def get_canvas_manifest(self): app_name = "PowerApp_Documentation" # get name from CanvasManifest.json if os.path.isfile(self.source_path + "CanvasManifest.json"): with open(self.source_path + "CanvasManifest.json", "r", encoding="utf-8") as file: canvas_manifest = json.load(file) - app_name = canvas_manifest["PublishInfo"]["AppName"] - return app_name + return canvas_manifest From 27a9ee26b4a2686beb9de396d4e6ac6d17468834 Mon Sep 17 00:00:00 2001 From: Sebastian Muthwill Date: Sat, 16 Oct 2021 22:29:17 +0200 Subject: [PATCH 2/4] fix: remove doubled lines in screenflow #19 --- docu/media/Screenflow_example.png | Bin 49977 -> 49977 bytes example/Meeting Capture Demo-doc.md | 886 ++++++++++++++++++++++++++- powerapps_docstring/documentation.py | 7 +- 3 files changed, 870 insertions(+), 23 deletions(-) diff --git a/docu/media/Screenflow_example.png b/docu/media/Screenflow_example.png index 88b6f3f4920dda73ec6d34a9080626af9d28d0b8..64fb47b53b854c9ed8989da4980abd01890fe885 100644 GIT binary patch delta 37960 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 SketchScreen ConfirmScreen ==> HomeScreen ConfirmScreen ==> FollowUpScreen ConfirmScreen ==> WelcomeScreen -ConfirmScreen ==> WelcomeScreen EmailScreen ==> ConfirmScreen ExportPopUpsScreen ==> ExportScreen -ExportPopUpsScreen ==> ExportScreen -ExportPopUpsScreen ==> ExportScreen ExportPopUpsScreen ==> ConfirmScreen ExportScreen ==> HomeScreen ExportScreen ==> ExportPopUpsScreen -ExportScreen ==> ExportPopUpsScreen -ExportScreen ==> ExportPopUpsScreen FollowUpScreen ==> FollowUpTimesScreen FollowUpTimesScreen ==> ConfirmScreen HomePopUpsScreen ==> HomeScreen -HomePopUpsScreen ==> HomeScreen -HomePopUpsScreen ==> HomeScreen HomeScreen ==> SketchScreen HomeScreen ==> CameraScreen HomeScreen ==> EmailScreen -HomeScreen ==> EmailScreen HomeScreen ==> AttachmentsScreen HomeScreen ==> ExportScreen HomeScreen ==> HomePopUpsScreen @@ -155,6 +147,20 @@ See attachments created during meeting ``` ='nav-logo' ``` +### AttachmentsHeader As label + +#### Size + + +``` +=27 +``` +#### Text + + +``` +="Meeting Attachments" +``` ### PhotosIcon As image #### Image @@ -163,6 +169,20 @@ See attachments created during meeting ``` ='attachments-camera' ``` +### PhotosHeader As label + +#### Size + + +``` +=15 +``` +#### Text + + +``` +="Photos" +``` ### PhotosGallery As gallery.galleryHorizontal #### Items @@ -178,6 +198,20 @@ See attachments created during meeting =Set(ShowOverlay, true); Set(SelectedImage, ThisItem) ``` +### PhotosCount As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +=CountRows(Photos) & If(CountRows(Photos) = 1, " photo has", " photos have") & " been attached to this meeting" +``` ### SketchesIcon As image #### Image @@ -186,6 +220,34 @@ Set(SelectedImage, ThisItem) ``` ='attachments-sketch' ``` +### SketchesHeader As label + +#### Size + + +``` +=15 +``` +#### Text + + +``` +="Sketches" +``` +### SketchCount As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +=CountRows(Sketches) & If(CountRows(Sketches) = 1, " sketch has", " sketches have") & " been attached to this meeting" +``` ### SketchesGallery As gallery.galleryHorizontal #### Items @@ -209,6 +271,20 @@ Set(SelectedImage, ThisItem) ``` =SelectedImage.Image ``` +### DeleteCertaintyText As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +="Are you sure you want to delete?" +``` ### CancelDeleteAttach As button #### OnSelect @@ -300,6 +376,14 @@ Set(ShowTakenImage, false) ``` ='nav-camera' ``` +### BannerText As label + +#### Text + + +``` +=If(ShowTakenImage, "Keep or discard this image?", ShowImageSaved, "Saved!", "Tap the image to take a photo") +``` ## CollectionsAndVariables --- @@ -375,6 +459,20 @@ If(ExportConfirmed, Email meeting notes to attendees +### BannerHeader As label + +#### Size + + +``` +=12 +``` +#### Text + + +``` +=SelectedMeeting.Subject +``` ### AppLogo4 As image #### Image @@ -383,6 +481,20 @@ Email meeting notes to attendees ``` ='nav-logo' ``` +### EmailBannerText As label + +#### Size + + +``` +=27 +``` +#### Text + + +``` +="Email attendee" & If(MultiRecipients, "s") & ":" +``` ### SendEmail As button #### OnSelect @@ -408,6 +520,20 @@ Navigate(ConfirmScreen, None) ``` ="" ``` +### Label16 As label + +#### Size + + +``` +=15 +``` +#### Text + + +``` +="Recipient" & If(MultiRecipients, "s (" & CountRows(EmailRecipients) & ")") +``` ### EmailRecipientGallery As gallery.galleryHorizontal #### Items @@ -416,8 +542,36 @@ Navigate(ConfirmScreen, None) ``` =EmailRecipients ``` +### Label16_1 As label + +#### Size + + +``` +=15 +``` +#### Text + + +``` +="Subject" +``` ### EmailSubject As text +### Label16_2 As label + +#### Size + + +``` +=15 +``` +#### Text + + +``` +="Message" +``` ### EmailMessage As text ## ExportPopUpsScreen @@ -425,6 +579,48 @@ Navigate(ConfirmScreen, None) --- ### ExportPopUpsScreen As screen +### OverlayHeader_1 As label + +#### Size + + +``` +=28 +``` +#### Text + + +``` +=If(ShowOverlay, "Are you finished taking notes?", "Select Location") +``` +### NotebookOrPlan_1 As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +=If(ShowOneNote, "Notebook", "Plan") +``` +### SectionOrBucket_1 As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +=If(ShowOneNote, "Section", "Bucket") +``` ### ExportCancel_1 As button #### OnSelect @@ -471,6 +667,20 @@ Navigate(ExportScreen, None) ``` =If(ShowOverlay, "Yes, continue", "OK") ``` +### ExportConfirmText_1 As label + +#### Size + + +``` +=13.5 +``` +#### Text + + +``` +="Once you Export, your meeting summary will be shared and you will no longer have access to the edit page." +``` ## ExportScreen --- @@ -496,6 +706,20 @@ If(!IsEmpty(OneNoteBooks),ClearCollect(OneNoteSections,'OneNote(Business)'.GetSe If(IsEmpty(PlannerPlans), ClearCollect(PlannerPlans, Planner.ListMyPlans().value)); If(!IsEmpty(PlannerPlans),ClearCollect(PlannerBuckets,Planner.ListBuckets(PlannerPlanSelect_1.SelectedText.'data-ADB4D7A662F548B49FAC2B986E348A1Bid').value)) ``` +### ExportMeetingSubject As label + +#### Size + + +``` +=12 +``` +#### Text + + +``` +=SelectedMeeting.Subject +``` ### AppLogo7 As image #### Image @@ -504,6 +728,42 @@ If(!IsEmpty(PlannerPlans),ClearCollect(PlannerBuckets,Planner.ListBuckets(Planne ``` ='nav-logo' ``` +### ExportBannerHeader As label + +#### Size + + +``` +=27 +``` +#### Text + + +``` +="Export " & SelectedMeeting.Subject +``` +### ExportQuestion As label + +#### Text + + +``` +="Where would you like to export to?" +``` +### DataLossWarnText As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +="Unless you select an export location, your meeting notes, attachments, and tasks will be lost once you exit the application." +``` ### ExportButton As button #### OnSelect @@ -541,6 +801,34 @@ Navigate(ExportPopUpsScreen, None) ``` ='one-note' ``` +### OneNoteHeader As label + +#### Size + + +``` +=15 +``` +#### Text + + +``` +="OneNote" +``` +### OneNoteExportDescript As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +="Export meeting summary, notes, attachments, and tasks to your OneNote." +``` ### ShowOneNoteSelection As button #### OnSelect @@ -558,6 +846,48 @@ ClearCollect(OneNoteSections, 'OneNote(Business)'.GetSectionsInNotebook(OneNoteB ``` =If(ExportToOneNote.Height > 0, "Select new location", "Select Location") ``` +### OneNoteDataLossDescript As label + +#### Size + + +``` +=9 +``` +#### Text + + +``` +="Photos and sketches cannot be exported to OneNote. ‘Export to Email’ to prevent attachments from being lost." +``` +### OneNoteExportLocation As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +=SelectedNoteBook.Value & " - " & SelectedSection.'data-ADB4D7A662F548B49FAC2B986E348A1Bname' +``` +### ExportToOneNote As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +="Export to:" +``` ### EmailIcon As image #### Image @@ -566,6 +896,34 @@ ClearCollect(OneNoteSections, 'OneNote(Business)'.GetSectionsInNotebook(OneNoteB ``` =outlook ``` +### EmailHeader As label + +#### Size + + +``` +=15 +``` +#### Text + + +``` +="Email" +``` +### EmailExportDescript As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +="Email meeting summary, notes, attachments, and tasks to the attendees." +``` ### RecipientGalleryBkg As button #### Text @@ -574,6 +932,20 @@ ClearCollect(OneNoteSections, 'OneNote(Business)'.GetSectionsInNotebook(OneNoteB ``` ="" ``` +### AttendeeCount As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +="Attendees (" & CountRows(EmailRecipients) & ")" +``` ### EmailRecipientsGallery As gallery.galleryVertical #### Items @@ -582,6 +954,20 @@ ClearCollect(OneNoteSections, 'OneNote(Business)'.GetSectionsInNotebook(OneNoteB ``` =EmailRecipients ``` +### AddAttendee As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +="Add attendee" +``` ### AssnTaskSearchUser_1 As text ### UserSearchResults As gallery.galleryVertical @@ -598,6 +984,14 @@ ClearCollect(OneNoteSections, 'OneNote(Business)'.GetSectionsInNotebook(OneNoteB ``` =If(Not(ThisItem.Id in EmailRecipients.Id), Collect(EmailRecipients, ThisItem)) ``` +### LoadingIndicator2_1 As label + +#### Text + + +``` +="Searching for users..." +``` ### PlannerIcon As image #### Image @@ -606,6 +1000,34 @@ ClearCollect(OneNoteSections, 'OneNote(Business)'.GetSectionsInNotebook(OneNoteB ``` =planner ``` +### OfficePlanner As label + +#### Size + + +``` +=15 +``` +#### Text + + +``` +="Office Planner" +``` +### PlannerExportDescript As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +="Sync assigned tasks with Office Planner" +``` ### ShowPlannerSelection As button #### OnSelect @@ -621,6 +1043,34 @@ Navigate(ExportPopUpsScreen, None) ``` =If(PlannerExportTo.Height > 0, "Select new location", "Select Location") ``` +### PlannerExportLocation As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +=SelectedPlan.'data-ADB4D7A662F548B49FAC2B986E348A1Btitle' & " - " & SelectedBucket.'data-ADB4D7A662F548B49FAC2B986E348A1Bname' +``` +### PlannerExportTo As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +="Export to:" +``` ## FollowUpScreen --- @@ -643,6 +1093,20 @@ ClearCollect(FollowUpMeetingAttendees, MeetingAttendees) ``` ='nav-logo' ``` +### FollowUpHeader As label + +#### Size + + +``` +=27 +``` +#### Text + + +``` +="Schedule a follow up meeting" +``` ### FindAvailableTimesButton As button #### OnSelect @@ -663,34 +1127,90 @@ ClearCollect(FollowUpMeetingAttendees, MeetingAttendees) ``` -="" +="" +``` +### FollowUpAttendeeCount As label + +#### Size + + +``` +=15 +``` +#### Text + + +``` +="Attendees (" & CountRows(FollowUpMeetingAttendees) & ")" +``` +### FollowUpAttendeesGall As gallery.galleryVertical + +#### Items + + +``` +=FollowUpMeetingAttendees +``` +### AddFollowUpAttendee As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +="Add attendee" +``` +### FollowUpSearchText As text + +### FollowUpSearchUserResults As gallery.galleryVertical + +#### Items + + +``` +=If(!IsBlank(FollowUpSearchText.Text), Office365Users.SearchUser({searchTerm:Trim(FollowUpSearchText.Text), top:15})) +``` +#### OnSelect + + +``` +=If(Not(ThisItem.Id in FollowUpMeetingAttendees.Id), Collect(FollowUpMeetingAttendees, ThisItem)) +``` +### Label16_3 As label + +#### Size + + +``` +=15 ``` -### FollowUpAttendeesGall As gallery.galleryVertical - -#### Items +#### Text ``` -=FollowUpMeetingAttendees +="Subject" ``` -### FollowUpSearchText As text +### FollowUpSubject As text -### FollowUpSearchUserResults As gallery.galleryVertical +### Label16_4 As label -#### Items +#### Size ``` -=If(!IsBlank(FollowUpSearchText.Text), Office365Users.SearchUser({searchTerm:Trim(FollowUpSearchText.Text), top:15})) +=15 ``` -#### OnSelect +#### Text ``` -=If(Not(ThisItem.Id in FollowUpMeetingAttendees.Id), Collect(FollowUpMeetingAttendees, ThisItem)) +="Message" ``` -### FollowUpSubject As text - ### FollowUpMessage As text ## FollowUpTimesScreen @@ -722,6 +1242,20 @@ ClearCollect(HoursList, {Name:"12:00 am",Minutes:0}, {Name:"12:30 am",Minutes:30 ``` ='nav-logo' ``` +### FollowUpTimesHeader As label + +#### Size + + +``` +=27 +``` +#### Text + + +``` +="Schedule a follow up meeting" +``` ### SendInvite As button #### OnSelect @@ -741,6 +1275,48 @@ Navigate(ConfirmScreen,None) ``` ="Send Invite" ``` +### Label20_10 As label + +#### Size + + +``` +=15 +``` +#### Text + + +``` +="Desired date for the meeting" +``` +### Label20_12 As label + +#### Size + + +``` +=15 +``` +#### Text + + +``` +="Desired time range" +``` +### Label20_13 As label + +#### Size + + +``` +=15 +``` +#### Text + + +``` +="Meeting duration" +``` ### LoadAvailableTimes As button #### OnSelect @@ -770,6 +1346,20 @@ Set(Loading, false) ``` =HoursList ``` +### SelectAvailableTime As label + +#### Size + + +``` +=15 +``` +#### Text + + +``` +="Select an available time" +``` ### AvailableTimesGall As gallery.galleryVertical #### Items @@ -778,6 +1368,14 @@ Set(Loading, false) ``` =SortByColumns(MeetingTimes,"Confidence",Descending,"StartTime",Ascending) ``` +### LoadingIndicator3 As label + +#### Text + + +``` +="Retrieving available times..." +``` ## HomePopUpsScreen --- @@ -799,8 +1397,50 @@ If(IsEmpty(MeetingAttendees), Set(Loading, false) ) ``` +### AssnTaskHeader_1 As label + +#### Size + + +``` +=27 +``` +#### Text + + +``` +=If(ShowDataLossWarning, "Welcome to your meeting!", "Assign Task") +``` ### AssnTaskDescription_1 As text +### AssnTaskDateHeader_1 As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +="Due date" +``` +### AssnTaskToHeader_1 As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +="Assign to (your org only)" +``` ### AssnTaskGallery_2 As gallery.galleryVertical #### Items @@ -891,6 +1531,14 @@ If(!IsBlank(AssnTaskSearchUser_2.Text), Office365Users.SearchUser({searchTerm:Tr =Set(SelectedUser, {DisplayName:AssnTaskGallery_3.Selected.DisplayName, Id:AssnTaskGallery_3.Selected.Id, Image: AssnTaskGallery_3.Selected.AssnTaskUserImg_4.Image, JobTitle:AssnTaskGallery_3.Selected.JobTitle}); Set(UserSelected, true) ``` +### LoadingIndicator2_2 As label + +#### Text + + +``` +="Searching for users..." +``` ### AssnTaskUserImg_5 As image #### Image @@ -905,6 +1553,46 @@ Set(UserSelected, true) ``` = ``` +### AssnTaskUserName_5 As label + +#### OnSelect + + +``` += +``` +#### Size + + +``` +=8 +``` +#### Text + + +``` +=If(UserSelectedFromTasks,SelectedUserTasks.DisplayName,SelectedUser.DisplayName) +``` +### AssnTaskUserJob_5 As label + +#### OnSelect + + +``` += +``` +#### Size + + +``` +=8 +``` +#### Text + + +``` +=If(UserSelectedFromTasks,SelectedUserTasks.JobTitle,SelectedUser.JobTitle) +``` ### DataWarningAccept_1 As button #### OnSelect @@ -920,6 +1608,14 @@ Navigate(HomeScreen, None) ``` ="Got it!" ``` +### OrgAttendees_1 As label + +#### Text + + +``` +="No attendees in your org" +``` ## HomeScreen --- @@ -985,6 +1681,20 @@ Set(ExportConfirmed, false) ``` =Navigate(CameraScreen, None) ``` +### AttendeesBanner As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +="Attendees" +``` ### AttendeesBannerImage As image #### Image @@ -1001,6 +1711,20 @@ Set(ExportConfirmed, false) ``` =MeetingAttendees ``` +### LoadingIndicator1 As label + +#### Size + + +``` +=10 +``` +#### Text + + +``` +="Gathering meeting attendees..." +``` ### MailAllButton As button #### OnSelect @@ -1017,6 +1741,20 @@ ClearCollect(EmailRecipients, AttendeeGallery1.AllItems) ``` ="Email" ``` +### NotesBanner As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +="Notes" +``` ### NotesIcon As image #### Image @@ -1027,6 +1765,42 @@ ClearCollect(EmailRecipients, AttendeeGallery1.AllItems) ``` ### NotesInput As text +### DetailsBanner As label + +#### Text + + +``` +="Meeting Details" +``` +### MeetingTitle As label + +#### Size + + +``` +=15 +``` +#### Text + + +``` +=SelectedMeeting.Subject +``` +### HomeTimeRange As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +=Text(SelectedMeeting.Start,"[$-en-US]mmmm dd, yyyy")&" | " & Lower(Text(SelectedMeeting.Start,"[$-en-US]hh:mm am/pm"))&" - "&Lower(Text(SelectedMeeting.End,"[$-en-US]hh:mm am/pm")) & " (" & DateDiff(SelectedMeeting.Start, SelectedMeeting.End, Minutes) & " minutes)" +``` ### Finish_SaveButton As button #### OnSelect @@ -1055,6 +1829,20 @@ ClearCollect(EmailRecipients, AttendeeGallery1.AllItems) ``` =Select(Finish_SaveButton) ``` +### TasksBanner As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +="Planner Tasks" +``` ### TasksIcon As image #### Image @@ -1086,6 +1874,20 @@ Set(ShowOverlay, true) ``` ### TaskTitle As text +### InitialTaskCount As label + +#### Size + + +``` +=10.5 +``` +#### Text + + +``` +="0 tasks" +``` ## SketchScreen --- @@ -1161,6 +1963,20 @@ Set(ShowSketchSaved, true) ``` ="Save sketch" ``` +### SavedIndicator As label + +#### Size + + +``` +=12 +``` +#### Text + + +``` +="Saved!" +``` ## WelcomeScreen --- @@ -1207,6 +2023,34 @@ ClearCollect(Templates, ``` ="" ``` +### LblMeetTitle As label + +#### OnSelect + + +``` +=Select(Parent) +``` +#### Text + + +``` +=ThisItem.Subject +``` +### LblStart_End As label + +#### OnSelect + + +``` +=Select(Parent) +``` +#### Text + + +``` +=Lower(Text(ThisItem.Start,"[$-en-US]hh:mm am/pm"))&" - "&Lower(Text(ThisItem.End,"[$-en-US]hh:mm am/pm"))&" | "&ThisItem.Location +``` ### BtnChangeAuto As button #### OnSelect diff --git a/powerapps_docstring/documentation.py b/powerapps_docstring/documentation.py index e3e8a4e..f96126d 100644 --- a/powerapps_docstring/documentation.py +++ b/powerapps_docstring/documentation.py @@ -143,9 +143,12 @@ def get_recursively(search_dict, field): to_screen = to_screen.replace("\n", "").replace("\t", "").replace(" ", "").replace(")", "") screenflow_list.append(from_screen + " ==> " + to_screen.replace("\n", "").replace("\t", "").replace(" ", "")) - - #print(screenflow_list) screenflow_list.append(":::") + + # to avoid double entrys in the graph + # the doubled items are removed by convertig to dict and back to list + screenflow_list = list(dict.fromkeys(screenflow_list)) + return screenflow_list #"\n".join(screenflow_list) From 4c25ac9ee7408e33b5ea4f90696ba26112d87e82 Mon Sep 17 00:00:00 2001 From: Sebastian Muthwill Date: Sat, 16 Oct 2021 22:32:22 +0200 Subject: [PATCH 3/4] fix: brings screens in order based on manifest file --- example/Meeting Capture Demo-doc.md | 2021 ++++++++------------------- 1 file changed, 583 insertions(+), 1438 deletions(-) diff --git a/example/Meeting Capture Demo-doc.md b/example/Meeting Capture Demo-doc.md index 4984b61..6541cee 100644 --- a/example/Meeting Capture Demo-doc.md +++ b/example/Meeting Capture Demo-doc.md @@ -9,19 +9,19 @@ Contents * [OnStart](#onstart) * [Connections](#connections) * [Screens](#screens) - * [AttachmentsScreen](#attachmentsscreen) + * [WelcomeScreen](#welcomescreen) + * [HomeScreen](#homescreen) + * [SketchScreen](#sketchscreen) * [CameraScreen](#camerascreen) - * [CollectionsAndVariables](#collectionsandvariables) - * [ConfirmScreen](#confirmscreen) * [EmailScreen](#emailscreen) - * [ExportPopUpsScreen](#exportpopupsscreen) + * [AttachmentsScreen](#attachmentsscreen) + * [ConfirmScreen](#confirmscreen) * [ExportScreen](#exportscreen) * [FollowUpScreen](#followupscreen) * [FollowUpTimesScreen](#followuptimesscreen) * [HomePopUpsScreen](#homepopupsscreen) - * [HomeScreen](#homescreen) - * [SketchScreen](#sketchscreen) - * [WelcomeScreen](#welcomescreen) + * [ExportPopUpsScreen](#exportpopupsscreen) + * [CollectionsAndVariables](#collectionsandvariables) @@ -31,13 +31,11 @@ Contents An all-in-one meeting capture tool. ![](src\meetingcapturedemo\Assets\Images\meeting-capture-logo-full%403x.png) -This -tool helps you to keep everythin in one place during your meetings. +This tool helps you to keep everythin in one place during your meetings. Key features are: - View meeting details -- capture -notes and pictures of whiteboards +- capture notes and pictures of whiteboards - assign tasks - send meeeting notes to all attendees in one click @@ -109,214 +107,329 @@ With following datasources: :::mermaid graph LR +WelcomeScreen ==> HomePopUpsScreen +HomeScreen ==> SketchScreen +HomeScreen ==> CameraScreen +HomeScreen ==> EmailScreen +HomeScreen ==> AttachmentsScreen +HomeScreen ==> ExportScreen +HomeScreen ==> HomePopUpsScreen +SketchScreen ==> HomeScreen +SketchScreen ==> CameraScreen CameraScreen ==> HomeScreen CameraScreen ==> SketchScreen +EmailScreen ==> ConfirmScreen ConfirmScreen ==> HomeScreen ConfirmScreen ==> FollowUpScreen ConfirmScreen ==> WelcomeScreen -EmailScreen ==> ConfirmScreen -ExportPopUpsScreen ==> ExportScreen -ExportPopUpsScreen ==> ConfirmScreen ExportScreen ==> HomeScreen ExportScreen ==> ExportPopUpsScreen FollowUpScreen ==> FollowUpTimesScreen FollowUpTimesScreen ==> ConfirmScreen HomePopUpsScreen ==> HomeScreen -HomeScreen ==> SketchScreen -HomeScreen ==> CameraScreen -HomeScreen ==> EmailScreen -HomeScreen ==> AttachmentsScreen -HomeScreen ==> ExportScreen -HomeScreen ==> HomePopUpsScreen -SketchScreen ==> HomeScreen -SketchScreen ==> CameraScreen -WelcomeScreen ==> HomePopUpsScreen +ExportPopUpsScreen ==> ExportScreen +ExportPopUpsScreen ==> ConfirmScreen ::: -## AttachmentsScreen +## WelcomeScreen --- -### AttachmentsScreen As screen +### WelcomeScreen As screen -See attachments created during meeting -### AppLogo5 As image +if any additional meeting is captured in the same session, guarantees all collections are empty +#### OnVisible -#### Image + +``` +Clear(MeetingAttendees); +Clear(MeetingTimes); +Clear(EmailRecipients); +Clear(FollowUpMeetingAttendees); +Clear(Tasks); +Clear(Photos); +Clear(Sketches); +Clear(EmailAttachments); +Reset(NotesInput); +Reset(AssnTaskSearchUser_1); +Set(FollowUpConfirmed, false); +Set(EmailConfirmed, false); +Set(ExportConfirmed, false); + +/*Email and OneNote templates with {placeholder} values for dynamic information*/ + +ClearCollect(Templates, +{Template: "Email", Value: "" & "{MeetingName}" & "
[ Meeting Capture ]
" & "{MeetingName}" & "
" & "{MeetingStartDate}" &" | " & "{MeetingStartTime}" & " - "& "{MeetingEndTime}" & " (" & "{MeetingMinutes}" & " Minutes)
+
" & "{1}" & "
Attendees (" & "{MeetingAttendeeNum}" & ")
Meeting details
" & "{MeetingDetails}" & "
Meeting Notes
" & "{MeetingNotes}" & "
" & "{2}" & "
Tasks
"}, +{Template: "OneNote", Value: "" & "{MeetingName}" & "
 
[ Meeting Capture ]
 
 
" & "{MeetingName}" & "
" & "{MeetingStartDate}" &" | " & "{MeetingStartTime}"&" - "& "{MeetingEndTime}" & " (" & "{MeetingMinutes}" & " Minutes)
 
" & "{1}" & "
Attendees (" & "{MeetingAttendeeNum}" & ")
 
 
Meeting NotesTasks
" & "{MeetingNotes}" & "" & "{2}" & "
 
 
"}) +``` +### MeetingsGalleryBkg As button + +#### OnSelect ``` -='nav-logo' +=Select(Parent) +``` +#### Text + + +``` +="" ``` -### AttachmentsHeader As label +### BtnChangeAuto As button -#### Size +#### OnSelect ``` -=27 +=Set(AutoSelectMeeting, false) ``` #### Text ``` -="Meeting Attachments" +="Change" ``` -### PhotosIcon As image +## HomeScreen + +--- +### HomeScreen As screen -#### Image + +The main screen for meeting captures during a meeting. + +- create meeting notes +- create tasks +- see meeting details + +#### OnVisible ``` -='attachments-camera' +/*if any additional meeting is captured in the same session, guarantees no confirmation screens are shown in error*/ +Set(FollowUpConfirmed, false); +Set(EmailConfirmed, false); +Set(ExportConfirmed, false) ``` -### PhotosHeader As label +### AppLogo1 As image -#### Size +#### Image ``` -=15 +='nav-logo' ``` -#### Text +### NavHome1 As image + +#### Image ``` -="Photos" +='nav-notes' ``` -### PhotosGallery As gallery.galleryHorizontal +### NavSketch1 As image -#### Items +#### Image ``` -=Photos +='nav-sketch' ``` #### OnSelect ``` -=Set(ShowOverlay, true); -Set(SelectedImage, ThisItem) +=Navigate(SketchScreen, None) ``` -### PhotosCount As label +### NavPhotos1 As image -#### Size +#### Image ``` -=10.5 +='nav-camera' ``` -#### Text +#### OnSelect ``` -=CountRows(Photos) & If(CountRows(Photos) = 1, " photo has", " photos have") & " been attached to this meeting" +=Navigate(CameraScreen, None) ``` -### SketchesIcon As image +### AttendeesBannerImage As image #### Image ``` -='attachments-sketch' +=attendees +``` +### AttendeeGallery1 As gallery.galleryVertical + +#### Items + + +``` +=MeetingAttendees ``` -### SketchesHeader As label +### MailAllButton As button -#### Size +#### OnSelect ``` -=15 +=Navigate(EmailScreen, None); +Set(MultiRecipients, true); +ClearCollect(EmailRecipients, AttendeeGallery1.AllItems) ``` #### Text ``` -="Sketches" +="Email" +``` +### NotesIcon As image + +#### Image + + +``` +=notes ``` -### SketchCount As label +### NotesInput As text + +### Finish_SaveButton As button -#### Size +#### OnSelect ``` -=10.5 +=Navigate(ExportScreen, None) ``` #### Text ``` -=CountRows(Sketches) & If(CountRows(Sketches) = 1, " sketch has", " sketches have") & " been attached to this meeting" +="Finish & Save" ``` -### SketchesGallery As gallery.galleryHorizontal +### Finish_SaveIcon As image -#### Items +#### Image ``` -=Sketches +=export ``` #### OnSelect ``` -=Set(ShowOverlay, true); -Set(SelectedImage, ThisItem) +=Select(Finish_SaveButton) ``` -### AttachmentToDelete As image +### TasksIcon As image #### Image ``` -=SelectedImage.Image +=tasks ``` -### DeleteCertaintyText As label +### TaskGallery As gallery.galleryVertical -#### Size +#### Items ``` -=10.5 +=Tasks ``` -#### Text +#### OnSelect ``` -="Are you sure you want to delete?" +=If(CountRows(Tasks) > 0, +Set(SelectedTask, ThisItem); +Set(TaskSelected, true); +Set(UserSelected, true); +Set(UserSelectedFromTasks, true); +Set(SelectedUserTasks, ThisItem.AssignToUser); +Set(ShowOverlay, true) +) ``` -### CancelDeleteAttach As button +### TaskTitle As text + +## SketchScreen + +--- +### SketchScreen As screen + +Create a sketch during a meeting. +#### OnVisible + + +``` +Set(ShowSketchSaved, false) +``` +### AppLogo2 As image + +#### Image + + +``` +='nav-logo' +``` +### NavHome2 As image + +#### Image + + +``` +='nav-notes' +``` #### OnSelect ``` -=Set(AttachmentDeleteConfirm, false); -Set(ShowOverlay, false) +=Navigate(HomeScreen, None) ``` -#### Text +### NavSketch2 As image + +#### Image ``` -=If(TaskSelected, "Delete", "Cancel") +='nav-sketch' ``` -### ConfirmDeleteAttach As button +### NavPhotos2 As image + +#### Image + +``` +='nav-camera' +``` #### OnSelect ``` -=Set(ShowOverlay, false); -Set(AttachmentDeleteConfirm, false); -RemoveIf(Sketches, SelectedImage.Name = Name); -RemoveIf(Photos, SelectedImage.Name = Name) +=Navigate(CameraScreen, None) +``` +### SaveSketch As button +#### OnSelect + + +``` +=/*store sketches in sketch collection*/ +Set(SketchNumber, SketchNumber + 1); +Collect(Sketches, {Image:SketchCanvas.Image, Name: "Sketch" & SketchNumber & ".jpg"}); +Reset(SketchCanvas); +Set(ShowSketchSaved, true) ``` #### Text ``` -="Yes, delete" +="Save sketch" ``` ## CameraScreen @@ -376,22 +489,160 @@ Set(ShowTakenImage, false) ``` ='nav-camera' ``` -### BannerText As label +## EmailScreen + +--- +### EmailScreen As screen -#### Text + +Email meeting notes to attendees +### AppLogo4 As image + +#### Image ``` -=If(ShowTakenImage, "Keep or discard this image?", ShowImageSaved, "Saved!", "Tap the image to take a photo") +='nav-logo' ``` -## CollectionsAndVariables +### SendEmail As button + +#### OnSelect + + +``` +=Office365Outlook.SendEmail(Concat(EmailRecipients, UserPrincipalName & ";"), EmailSubject.Text, EmailMessage.Text, {Importance: "Normal"}); +/*Sets text to display email confirmation info*/ +Set(EmailConfirmed, true); +Navigate(ConfirmScreen, None) +``` +#### Text + + +``` +="Send" +``` +### GalleryBkg As button + +#### Text + + +``` +="" +``` +### EmailRecipientGallery As gallery.galleryHorizontal + +#### Items + + +``` +=EmailRecipients +``` +### EmailSubject As text + +### EmailMessage As text + +## AttachmentsScreen --- -### CollectionsAndVariables As screen +### AttachmentsScreen As screen -This screen lists all collections and variables used inside the app +See attachments created during meeting +### AppLogo5 As image + +#### Image + + +``` +='nav-logo' +``` +### PhotosIcon As image + +#### Image + + +``` +='attachments-camera' +``` +### PhotosGallery As gallery.galleryHorizontal + +#### Items + + +``` +=Photos +``` +#### OnSelect + + +``` +=Set(ShowOverlay, true); +Set(SelectedImage, ThisItem) +``` +### SketchesIcon As image + +#### Image + + +``` +='attachments-sketch' +``` +### SketchesGallery As gallery.galleryHorizontal + +#### Items + + +``` +=Sketches +``` +#### OnSelect + + +``` +=Set(ShowOverlay, true); +Set(SelectedImage, ThisItem) +``` +### AttachmentToDelete As image + +#### Image + + +``` +=SelectedImage.Image +``` +### CancelDeleteAttach As button + +#### OnSelect + + +``` +=Set(AttachmentDeleteConfirm, false); +Set(ShowOverlay, false) +``` +#### Text + + +``` +=If(TaskSelected, "Delete", "Cancel") +``` +### ConfirmDeleteAttach As button + +#### OnSelect + + +``` +=Set(ShowOverlay, false); +Set(AttachmentDeleteConfirm, false); +RemoveIf(Sketches, SelectedImage.Name = Name); +RemoveIf(Photos, SelectedImage.Name = Name) +``` +#### Text + + +``` +="Yes, delete" +``` ## ConfirmScreen --- @@ -452,28 +703,32 @@ If(ExportConfirmed, Set(Loading, false) ) ``` -## EmailScreen +## ExportScreen --- -### EmailScreen As screen - - -Email meeting notes to attendees -### BannerHeader As label +### ExportScreen As screen -#### Size +Export creation screen +Select where to export to. +Possible exports: +- OneNote +- Office Planner +- Email -``` -=12 -``` -#### Text +#### OnVisible ``` -=SelectedMeeting.Subject +If(IsEmpty(EmailRecipients), + ClearCollect(EmailRecipients, AttendeeGallery1.AllItems) +); +If(IsEmpty(OneNoteBooks), ClearCollect(OneNoteBooks,'OneNote(Business)'.GetNotebooks())); +If(!IsEmpty(OneNoteBooks),ClearCollect(OneNoteSections,'OneNote(Business)'.GetSectionsInNotebook(OneNoteBookSelect_1.SelectedText.'data-ADB4D7A662F548B49FAC2B986E348A1BKey').value)); +If(IsEmpty(PlannerPlans), ClearCollect(PlannerPlans, Planner.ListMyPlans().value)); +If(!IsEmpty(PlannerPlans),ClearCollect(PlannerBuckets,Planner.ListBuckets(PlannerPlanSelect_1.SelectedText.'data-ADB4D7A662F548B49FAC2B986E348A1Bid').value)) ``` -### AppLogo4 As image +### AppLogo7 As image #### Image @@ -481,246 +736,217 @@ Email meeting notes to attendees ``` ='nav-logo' ``` -### EmailBannerText As label +### ExportButton As button -#### Size +#### OnSelect ``` -=27 +=Set(ShowOverlay, true); +Navigate(ExportPopUpsScreen, None) ``` #### Text ``` -="Email attendee" & If(MultiRecipients, "s") & ":" +="Export" ``` -### SendEmail As button +### ExportIcon As image -#### OnSelect +#### Image ``` -=Office365Outlook.SendEmail(Concat(EmailRecipients, UserPrincipalName & ";"), EmailSubject.Text, EmailMessage.Text, {Importance: "Normal"}); -/*Sets text to display email confirmation info*/ -Set(EmailConfirmed, true); -Navigate(ConfirmScreen, None) +=export ``` -#### Text +#### OnSelect ``` -="Send" +=Select(ExportButton) ``` -### GalleryBkg As button +### OneNoteIcon As image -#### Text +#### Image ``` -="" +='one-note' ``` -### Label16 As label +### ShowOneNoteSelection As button -#### Size +#### OnSelect ``` -=15 +=Set(ShowOneNote, true); +Navigate(ExportPopUpsScreen, None); +/*retrieves OneNote sections of (pre)selected OneNote book (if user hasn't selected one yet)*/ +ClearCollect(OneNoteSections, 'OneNote(Business)'.GetSectionsInNotebook(OneNoteBookSelect_1.SelectedText.'data-ADB4D7A662F548B49FAC2B986E348A1BKey').value) ``` #### Text ``` -="Recipient" & If(MultiRecipients, "s (" & CountRows(EmailRecipients) & ")") +=If(ExportToOneNote.Height > 0, "Select new location", "Select Location") ``` -### EmailRecipientGallery As gallery.galleryHorizontal +### EmailIcon As image -#### Items +#### Image ``` -=EmailRecipients +=outlook ``` -### Label16_1 As label +### RecipientGalleryBkg As button -#### Size +#### Text ``` -=15 +="" ``` -#### Text +### EmailRecipientsGallery As gallery.galleryVertical + +#### Items ``` -="Subject" +=EmailRecipients ``` -### EmailSubject As text +### AssnTaskSearchUser_1 As text -### Label16_2 As label +### UserSearchResults As gallery.galleryVertical -#### Size +#### Items ``` -=15 +=If(!IsBlank(AssnTaskSearchUser_1.Text), Office365Users.SearchUser({searchTerm:Trim(AssnTaskSearchUser_1.Text), top:15})) ``` -#### Text +#### OnSelect ``` -="Message" +=If(Not(ThisItem.Id in EmailRecipients.Id), Collect(EmailRecipients, ThisItem)) ``` -### EmailMessage As text +### PlannerIcon As image + +#### Image -## ExportPopUpsScreen - ---- -### ExportPopUpsScreen As screen -### OverlayHeader_1 As label +``` +=planner +``` +### ShowPlannerSelection As button -#### Size +#### OnSelect ``` -=28 +=Set(ShowPlanner, true); +Navigate(ExportPopUpsScreen, None) ``` #### Text ``` -=If(ShowOverlay, "Are you finished taking notes?", "Select Location") +=If(PlannerExportTo.Height > 0, "Select new location", "Select Location") ``` -### NotebookOrPlan_1 As label +## FollowUpScreen + +--- +### FollowUpScreen As screen -#### Size + +Schedule follow up for this meeting +#### OnVisible ``` -=10.5 +Set(ExportConfirmed, false); +ClearCollect(FollowUpMeetingAttendees, MeetingAttendees) ``` -#### Text +### AppIcon7 As image + +#### Image ``` -=If(ShowOneNote, "Notebook", "Plan") +='nav-logo' ``` -### SectionOrBucket_1 As label +### FindAvailableTimesButton As button -#### Size +#### OnSelect ``` -=10.5 +=Navigate(FollowUpTimesScreen, None) ``` #### Text ``` -=If(ShowOneNote, "Section", "Bucket") +="Find Available Times" ``` -### ExportCancel_1 As button - -#### OnSelect - +### FollowUpGallBkg As button -``` -=Set(ShowOneNote, false); -Set(ShowPlanner, false); -Set(ShowOverlay, false); -Navigate(ExportScreen, None) -``` #### Text ``` -=If(TaskSelected, "Delete", "Cancel") +="" ``` -### ExportConfirm_1 As button +### FollowUpAttendeesGall As gallery.galleryVertical -#### OnSelect +#### Items ``` -=If(ShowOneNote, - Set(ShowOneNote, false); - Set(SelectedNoteBook, OneNoteBookSelect_1.SelectedText); - Set(SelectedSection, SectionsSelect_1.SelectedText); - Navigate(ExportScreen, None), - ShowPlanner, - Set(ShowPlanner, false); - Set(SelectedPlan, PlannerPlanSelect_1.SelectedText); - Set(SelectedBucket, PlannerBucketSelect_1.SelectedText); - Navigate(ExportScreen, None), - ShowOverlay, - Set(ShowOverlay, false); - Set(ExportConfirmed, true); - Navigate(ConfirmScreen, None) -) - +=FollowUpMeetingAttendees ``` -#### Text - +### FollowUpSearchText As text -``` -=If(ShowOverlay, "Yes, continue", "OK") -``` -### ExportConfirmText_1 As label +### FollowUpSearchUserResults As gallery.galleryVertical -#### Size +#### Items ``` -=13.5 +=If(!IsBlank(FollowUpSearchText.Text), Office365Users.SearchUser({searchTerm:Trim(FollowUpSearchText.Text), top:15})) ``` -#### Text +#### OnSelect ``` -="Once you Export, your meeting summary will be shared and you will no longer have access to the edit page." +=If(Not(ThisItem.Id in FollowUpMeetingAttendees.Id), Collect(FollowUpMeetingAttendees, ThisItem)) ``` -## ExportScreen +### FollowUpSubject As text + +### FollowUpMessage As text + +## FollowUpTimesScreen --- -### ExportScreen As screen +### FollowUpTimesScreen As screen -Export creation screen -Select where to export to. -Possible exports: -- OneNote -- Office Planner -- Email +Collections used in galleries and drop downs on this screen +- MeetingDurations +- HoursList #### OnVisible ``` -If(IsEmpty(EmailRecipients), - ClearCollect(EmailRecipients, AttendeeGallery1.AllItems) -); -If(IsEmpty(OneNoteBooks), ClearCollect(OneNoteBooks,'OneNote(Business)'.GetNotebooks())); -If(!IsEmpty(OneNoteBooks),ClearCollect(OneNoteSections,'OneNote(Business)'.GetSectionsInNotebook(OneNoteBookSelect_1.SelectedText.'data-ADB4D7A662F548B49FAC2B986E348A1BKey').value)); -If(IsEmpty(PlannerPlans), ClearCollect(PlannerPlans, Planner.ListMyPlans().value)); -If(!IsEmpty(PlannerPlans),ClearCollect(PlannerBuckets,Planner.ListBuckets(PlannerPlanSelect_1.SelectedText.'data-ADB4D7A662F548B49FAC2B986E348A1Bid').value)) -``` -### ExportMeetingSubject As label - -#### Size - - -``` -=12 -``` -#### Text - +ClearCollect(MeetingDurations, +{Name:"30 minutes", Minutes:30},{Name:"1 hour", Minutes:60},{Name:"90 minutes", Minutes:90},{Name:"2 hours", Minutes:120}, +{Name:"2.5 hours", Minutes:150},{Name:"3 hours", Minutes:180},{Name:"3.5 hours", Minutes:210},{Name:"4 hours", Minutes:240}); +ClearCollect(HoursList, {Name:"12:00 am",Minutes:0}, {Name:"12:30 am",Minutes:30}, {Name:"01:00 am",Minutes:60}, {Name:"01:30 am",Minutes:90}, {Name:"02:00 am",Minutes:120}, {Name:"02:30 am",Minutes:150}, {Name:"03:00 am",Minutes:180}, {Name:"03:30 am",Minutes:210}, {Name:"04:00 am",Minutes:240, Short: "4 am"}, {Name:"04:30 am",Minutes:270}, {Name:"05:00 am",Minutes:300}, {Name:"05:30 am",Minutes:330}, {Name:"06:00 am",Minutes:360}, {Name:"06:30 am",Minutes:390}, {Name:"07:00 am",Minutes:420}, {Name:"07:30 am",Minutes:450}, {Name:"08:00 am",Minutes:480, Short: "8 am"}, {Name:"08:30 am",Minutes:510}, {Name:"09:00 am",Minutes:540}, {Name:"09:30 am",Minutes:570}, {Name:"10:00 am",Minutes:600}, {Name:"10:30 am",Minutes:630}, {Name:"11:00 am",Minutes:660}, {Name:"11:30 am",Minutes:690}, {Name:"12:00 pm",Minutes:720, Short: "12 pm" +}, {Name:"12:30 pm",Minutes:750}, {Name:"01:00 pm",Minutes:780}, {Name:"01:30 pm",Minutes:810}, {Name:"02:00 pm",Minutes:840}, {Name:"02:30 pm",Minutes:870}, {Name:"03:00 pm",Minutes:900}, {Name:"03:30 pm",Minutes:930}, {Name:"04:00 pm",Minutes:960, Short: "4 pm"}, {Name:"04:30 pm",Minutes:990}, {Name:"05:00 pm",Minutes:1020}, {Name:"05:30 pm",Minutes:1050}, {Name:"06:00 pm",Minutes:1080}, {Name:"06:30 pm",Minutes:1110}, {Name:"07:00 pm",Minutes:1140}, {Name:"07:30 pm",Minutes:1170}, {Name:"08:00 pm",Minutes:1200, Short: "8 pm"}, {Name:"08:30 pm",Minutes:1230}, {Name:"09:00 pm",Minutes:1260}, {Name:"09:30 pm",Minutes:1290}, {Name:"10:00 pm",Minutes:1320}, {Name:"10:30 pm",Minutes:1350}, {Name:"11:00 pm",Minutes:1380}, {Name:"11:30 pm",Minutes:1410}) ``` -=SelectedMeeting.Subject -``` -### AppLogo7 As image +### AppIcon8 As image #### Image @@ -728,1340 +954,259 @@ If(!IsEmpty(PlannerPlans),ClearCollect(PlannerBuckets,Planner.ListBuckets(Planne ``` ='nav-logo' ``` -### ExportBannerHeader As label - -#### Size - +### SendInvite As button -``` -=27 -``` -#### Text +#### OnSelect ``` -="Export " & SelectedMeeting.Subject +=/*creates calendar event for meeting*/ +UpdateContext({requiredAttendees:Concat(FollowUpMeetingAttendees, UserPrincipalName & ";")}); +UpdateContext({requiredAttendees:Left(requiredAttendees, Len(requiredAttendees)-1)}); +Office365Outlook.V4CalendarPostItem(MyCalendarID, FollowUpSubject.Text, FollowUpStart, FollowUpEnd, "UTC",{importance:"Normal", body:FollowUpMessage.Text, showAs:"busy", requiredAttendees:requiredAttendees}); +Set(FollowUpConfirmed, true); +Navigate(ConfirmScreen,None) ``` -### ExportQuestion As label - #### Text ``` -="Where would you like to export to?" +="Send Invite" ``` -### DataLossWarnText As label +### LoadAvailableTimes As button -#### Size +#### OnSelect ``` -=10.5 +=Set(Loading, true); +/* +Collects available meeting times for attendees based on user determined data from this page. Adds 'StartTime' and 'EndTime' columns to the collection as a means of simplifying the MeetingTimeSlot column +*/ +ClearCollect(MeetingTimes,AddColumns(Office365Outlook.FindMeetingTimes({MaxCandidates:15,MinimumAttendeePercentage: 1, MeetingDuration: MeetingDurationSelection.SelectedText.'data-ADB4D7A662F548B49FAC2B986E348A1BMinutes',Start:Text(DateAdd(DatePicker1.SelectedDate,MeetingStartRange.SelectedText.'data-ADB4D7A662F548B49FAC2B986E348A1BMinutes', Minutes), UTC),End:Text(DateAdd(DatePicker1.SelectedDate, MeetingEndRange.SelectedText.'data-ADB4D7A662F548B49FAC2B986E348A1BMinutes', Minutes), UTC),RequiredAttendees:Concat(FollowUpMeetingAttendees,UserPrincipalName & ";")}).MeetingTimeSuggestions,"StartTime",MeetingTimeSlot.Start.DateTime, +"EndTime",MeetingTimeSlot.End.DateTime)); +Set(ShowMeetingTimes, true); +Set(Loading, false) ``` #### Text ``` -="Unless you select an export location, your meeting notes, attachments, and tasks will be lost once you exit the application." +="Find Available Times" ``` -### ExportButton As button - -#### OnSelect - +### TimeLine As gallery.galleryHorizontal -``` -=Set(ShowOverlay, true); -Navigate(ExportPopUpsScreen, None) -``` -#### Text +#### Items ``` -="Export" +=HoursList ``` -### ExportIcon As image +### AvailableTimesGall As gallery.galleryVertical -#### Image +#### Items ``` -=export +=SortByColumns(MeetingTimes,"Confidence",Descending,"StartTime",Ascending) ``` -#### OnSelect - +## HomePopUpsScreen + +--- +### HomePopUpsScreen As screen -``` -=Select(ExportButton) -``` -### OneNoteIcon As image -#### Image +Gathers and stores the Office 365 profiles of the meeting attendees if they are within the app user's org +#### OnVisible ``` -='one-note' +If(IsEmpty(MeetingAttendees), + Set(Loading, true); + ClearCollect(MeetingAttendeeEmails, Filter(Split(Concatenate(SelectedMeeting.RequiredAttendees, + SelectedMeeting.OptionalAttendees), ";"), Result <> "")); + ClearCollect(MeetingAttendeesTemp, ForAll(MeetingAttendeeEmails, If(Lower(MyDomain) = Lower(Last(Split(Result, "@")).Result), Office365Users.UserProfileV2(Result), {displayName: Result, id: "", image: Blank(), jobTitle: "", userPrincipalName: Result}))); + ClearCollect(MeetingAttendees, RenameColumns(MeetingAttendeesTemp, "id", "Id", "jobTitle", "JobTitle", "displayName", "DisplayName", "userPrincipalName", "UserPrincipalName")); + Set(SelectedMeetingDuration, DateDiff(SelectedMeeting.Start, SelectedMeeting.End, Seconds)); + Set(Loading, false) +) ``` -### OneNoteHeader As label +### AssnTaskDescription_1 As text + +### AssnTaskGallery_2 As gallery.galleryVertical -#### Size +#### Items ``` -=15 +=/* +In-org attendee gallery for task assignment +If the attendee DisplayName is an actual name and not an email address, then they are in the app user's org, so we can assign them a task. +Tasks are stored in an 0365 tenant, so cannot be assigned to external users +*/ +Filter(AttendeeGallery1.AllItems, Not(".com" in DisplayName)) ``` -#### Text +#### OnSelect ``` -="OneNote" +=If(AssnTaskGallery_2.Visible, + Set(UserSelected, true); + Set(SelectedUser, {DisplayName:AssnTaskGallery_2.Selected.DisplayName, Id:AssnTaskGallery_2.Selected.Id, Image: AssnTaskGallery_2.Selected.AssnTaskUserImg_3.Image, JobTitle:AssnTaskGallery_2.Selected.JobTitle}) +) ``` -### OneNoteExportDescript As label +### AssnTaskSearchUser_2 As text + +### CancelAssnTask_1 As button -#### Size +#### OnSelect ``` -=10.5 +=Navigate(HomeScreen, None); +Set(ShowOverlay, !ShowOverlay); +If(TaskSelected, RemoveIf(Tasks, Id = SelectedTask.Id)); +Set(UserSelected, false); +Set(UserSelectedFromTasks, false); +Set(TaskSelected, false); +Reset(AssnTaskSearchUser_2); +Reset(AssnTaskDueDate_1); +Reset(AssnTaskDescription_1); +Reset(TaskTitle) ``` #### Text ``` -="Export meeting summary, notes, attachments, and tasks to your OneNote." +=If(TaskSelected, "Delete", "Cancel") ``` -### ShowOneNoteSelection As button +### SaveAssnTask_1 As button #### OnSelect ``` -=Set(ShowOneNote, true); -Navigate(ExportPopUpsScreen, None); -/*retrieves OneNote sections of (pre)selected OneNote book (if user hasn't selected one yet)*/ -ClearCollect(OneNoteSections, 'OneNote(Business)'.GetSectionsInNotebook(OneNoteBookSelect_1.SelectedText.'data-ADB4D7A662F548B49FAC2B986E348A1BKey').value) +=Navigate(HomeScreen, None); +Set(ShowOverlay, !ShowOverlay); +/*If user is making a new task, collect the information from form, otherwise, revise the task the user is editing*/ +If(!TaskSelected, + Collect(Tasks, {Id: CountRows(Tasks)+1, Name:AssnTaskDescription_1.Text, DueDate: AssnTaskDueDate_1.SelectedDate, +AssignToUser: SelectedUser}), + Patch(Tasks, LookUp(Tasks, Id=SelectedTask.Id), {Name:AssnTaskDescription_1.Text, DueDate: AssnTaskDueDate_1.SelectedDate, AssignToUser: SelectedUser})); +Set(UserSelected, false); +Set(UserSelectedFromTasks, false); +Set(TaskSelected, false); +Reset(AssnTaskSearchUser_2); +Reset(AssnTaskDueDate_1); +Reset(AssnTaskDescription_1); +Reset(TaskTitle) ``` #### Text ``` -=If(ExportToOneNote.Height > 0, "Select new location", "Select Location") +="Save task" ``` -### OneNoteDataLossDescript As label +### AssnTaskGallery_3 As gallery.galleryVertical -#### Size +#### Items ``` -=9 +=/*User search gallery*/ +If(!IsBlank(AssnTaskSearchUser_2.Text), Office365Users.SearchUser({searchTerm:Trim(AssnTaskSearchUser_2.Text), top:15})) ``` -#### Text +#### OnSelect ``` -="Photos and sketches cannot be exported to OneNote. ‘Export to Email’ to prevent attachments from being lost." +=Set(SelectedUser, {DisplayName:AssnTaskGallery_3.Selected.DisplayName, Id:AssnTaskGallery_3.Selected.Id, Image: AssnTaskGallery_3.Selected.AssnTaskUserImg_4.Image, JobTitle:AssnTaskGallery_3.Selected.JobTitle}); +Set(UserSelected, true) ``` -### OneNoteExportLocation As label +### AssnTaskUserImg_5 As image -#### Size +#### Image ``` -=10.5 +=If(UserSelectedFromTasks,SelectedUserTasks.Image,SelectedUser.Image) ``` -#### Text +#### OnSelect ``` -=SelectedNoteBook.Value & " - " & SelectedSection.'data-ADB4D7A662F548B49FAC2B986E348A1Bname' += ``` -### ExportToOneNote As label +### DataWarningAccept_1 As button -#### Size +#### OnSelect ``` -=10.5 +=Set(ShowDataLossWarning, false); +Navigate(HomeScreen, None) ``` #### Text ``` -="Export to:" +="Got it!" ``` -### EmailIcon As image - -#### Image - +## ExportPopUpsScreen + +--- +### ExportPopUpsScreen As screen -``` -=outlook -``` -### EmailHeader As label +### ExportCancel_1 As button -#### Size +#### OnSelect ``` -=15 +=Set(ShowOneNote, false); +Set(ShowPlanner, false); +Set(ShowOverlay, false); +Navigate(ExportScreen, None) ``` #### Text ``` -="Email" +=If(TaskSelected, "Delete", "Cancel") ``` -### EmailExportDescript As label - -#### Size - +### ExportConfirm_1 As button -``` -=10.5 -``` -#### Text +#### OnSelect ``` -="Email meeting summary, notes, attachments, and tasks to the attendees." -``` -### RecipientGalleryBkg As button - -#### Text - - -``` -="" -``` -### AttendeeCount As label - -#### Size - - -``` -=10.5 -``` -#### Text - - -``` -="Attendees (" & CountRows(EmailRecipients) & ")" -``` -### EmailRecipientsGallery As gallery.galleryVertical - -#### Items - - -``` -=EmailRecipients -``` -### AddAttendee As label - -#### Size - - -``` -=10.5 -``` -#### Text - - -``` -="Add attendee" -``` -### AssnTaskSearchUser_1 As text - -### UserSearchResults As gallery.galleryVertical - -#### Items - - -``` -=If(!IsBlank(AssnTaskSearchUser_1.Text), Office365Users.SearchUser({searchTerm:Trim(AssnTaskSearchUser_1.Text), top:15})) -``` -#### OnSelect - - -``` -=If(Not(ThisItem.Id in EmailRecipients.Id), Collect(EmailRecipients, ThisItem)) -``` -### LoadingIndicator2_1 As label - -#### Text - - -``` -="Searching for users..." -``` -### PlannerIcon As image - -#### Image - - -``` -=planner -``` -### OfficePlanner As label - -#### Size - - -``` -=15 -``` -#### Text - - -``` -="Office Planner" -``` -### PlannerExportDescript As label - -#### Size - - -``` -=10.5 -``` -#### Text - - -``` -="Sync assigned tasks with Office Planner" -``` -### ShowPlannerSelection As button - -#### OnSelect - - -``` -=Set(ShowPlanner, true); -Navigate(ExportPopUpsScreen, None) -``` -#### Text - - -``` -=If(PlannerExportTo.Height > 0, "Select new location", "Select Location") -``` -### PlannerExportLocation As label - -#### Size - - -``` -=10.5 -``` -#### Text - - -``` -=SelectedPlan.'data-ADB4D7A662F548B49FAC2B986E348A1Btitle' & " - " & SelectedBucket.'data-ADB4D7A662F548B49FAC2B986E348A1Bname' -``` -### PlannerExportTo As label - -#### Size - - -``` -=10.5 -``` -#### Text - - -``` -="Export to:" -``` -## FollowUpScreen - ---- -### FollowUpScreen As screen - - -Schedule follow up for this meeting -#### OnVisible - - -``` -Set(ExportConfirmed, false); -ClearCollect(FollowUpMeetingAttendees, MeetingAttendees) -``` -### AppIcon7 As image - -#### Image - - -``` -='nav-logo' -``` -### FollowUpHeader As label - -#### Size - - -``` -=27 -``` -#### Text - - -``` -="Schedule a follow up meeting" -``` -### FindAvailableTimesButton As button - -#### OnSelect - - -``` -=Navigate(FollowUpTimesScreen, None) -``` -#### Text - - -``` -="Find Available Times" -``` -### FollowUpGallBkg As button - -#### Text - - -``` -="" -``` -### FollowUpAttendeeCount As label - -#### Size - - -``` -=15 -``` -#### Text - - -``` -="Attendees (" & CountRows(FollowUpMeetingAttendees) & ")" -``` -### FollowUpAttendeesGall As gallery.galleryVertical - -#### Items - - -``` -=FollowUpMeetingAttendees -``` -### AddFollowUpAttendee As label - -#### Size - - -``` -=10.5 -``` -#### Text - - -``` -="Add attendee" -``` -### FollowUpSearchText As text - -### FollowUpSearchUserResults As gallery.galleryVertical - -#### Items - - -``` -=If(!IsBlank(FollowUpSearchText.Text), Office365Users.SearchUser({searchTerm:Trim(FollowUpSearchText.Text), top:15})) -``` -#### OnSelect - - -``` -=If(Not(ThisItem.Id in FollowUpMeetingAttendees.Id), Collect(FollowUpMeetingAttendees, ThisItem)) -``` -### Label16_3 As label - -#### Size - - -``` -=15 -``` -#### Text - - -``` -="Subject" -``` -### FollowUpSubject As text - -### Label16_4 As label - -#### Size - - -``` -=15 -``` -#### Text - - -``` -="Message" -``` -### FollowUpMessage As text - -## FollowUpTimesScreen - ---- -### FollowUpTimesScreen As screen - - -Collections used in galleries and drop downs on this screen -- MeetingDurations -- HoursList - -#### OnVisible - - -``` -ClearCollect(MeetingDurations, -{Name:"30 minutes", Minutes:30},{Name:"1 hour", Minutes:60},{Name:"90 minutes", Minutes:90},{Name:"2 hours", Minutes:120}, -{Name:"2.5 hours", Minutes:150},{Name:"3 hours", Minutes:180},{Name:"3.5 hours", Minutes:210},{Name:"4 hours", Minutes:240}); - -ClearCollect(HoursList, {Name:"12:00 am",Minutes:0}, {Name:"12:30 am",Minutes:30}, {Name:"01:00 am",Minutes:60}, {Name:"01:30 am",Minutes:90}, {Name:"02:00 am",Minutes:120}, {Name:"02:30 am",Minutes:150}, {Name:"03:00 am",Minutes:180}, {Name:"03:30 am",Minutes:210}, {Name:"04:00 am",Minutes:240, Short: "4 am"}, {Name:"04:30 am",Minutes:270}, {Name:"05:00 am",Minutes:300}, {Name:"05:30 am",Minutes:330}, {Name:"06:00 am",Minutes:360}, {Name:"06:30 am",Minutes:390}, {Name:"07:00 am",Minutes:420}, {Name:"07:30 am",Minutes:450}, {Name:"08:00 am",Minutes:480, Short: "8 am"}, {Name:"08:30 am",Minutes:510}, {Name:"09:00 am",Minutes:540}, {Name:"09:30 am",Minutes:570}, {Name:"10:00 am",Minutes:600}, {Name:"10:30 am",Minutes:630}, {Name:"11:00 am",Minutes:660}, {Name:"11:30 am",Minutes:690}, {Name:"12:00 pm",Minutes:720, Short: "12 pm" -}, {Name:"12:30 pm",Minutes:750}, {Name:"01:00 pm",Minutes:780}, {Name:"01:30 pm",Minutes:810}, {Name:"02:00 pm",Minutes:840}, {Name:"02:30 pm",Minutes:870}, {Name:"03:00 pm",Minutes:900}, {Name:"03:30 pm",Minutes:930}, {Name:"04:00 pm",Minutes:960, Short: "4 pm"}, {Name:"04:30 pm",Minutes:990}, {Name:"05:00 pm",Minutes:1020}, {Name:"05:30 pm",Minutes:1050}, {Name:"06:00 pm",Minutes:1080}, {Name:"06:30 pm",Minutes:1110}, {Name:"07:00 pm",Minutes:1140}, {Name:"07:30 pm",Minutes:1170}, {Name:"08:00 pm",Minutes:1200, Short: "8 pm"}, {Name:"08:30 pm",Minutes:1230}, {Name:"09:00 pm",Minutes:1260}, {Name:"09:30 pm",Minutes:1290}, {Name:"10:00 pm",Minutes:1320}, {Name:"10:30 pm",Minutes:1350}, {Name:"11:00 pm",Minutes:1380}, {Name:"11:30 pm",Minutes:1410}) -``` -### AppIcon8 As image - -#### Image - - -``` -='nav-logo' -``` -### FollowUpTimesHeader As label - -#### Size - - -``` -=27 -``` -#### Text - - -``` -="Schedule a follow up meeting" -``` -### SendInvite As button - -#### OnSelect - - -``` -=/*creates calendar event for meeting*/ -UpdateContext({requiredAttendees:Concat(FollowUpMeetingAttendees, UserPrincipalName & ";")}); -UpdateContext({requiredAttendees:Left(requiredAttendees, Len(requiredAttendees)-1)}); -Office365Outlook.V4CalendarPostItem(MyCalendarID, FollowUpSubject.Text, FollowUpStart, FollowUpEnd, "UTC",{importance:"Normal", body:FollowUpMessage.Text, showAs:"busy", requiredAttendees:requiredAttendees}); -Set(FollowUpConfirmed, true); -Navigate(ConfirmScreen,None) -``` -#### Text - - -``` -="Send Invite" -``` -### Label20_10 As label - -#### Size - - -``` -=15 -``` -#### Text - - -``` -="Desired date for the meeting" -``` -### Label20_12 As label - -#### Size - - -``` -=15 -``` -#### Text - - -``` -="Desired time range" -``` -### Label20_13 As label - -#### Size - - -``` -=15 -``` -#### Text - - -``` -="Meeting duration" -``` -### LoadAvailableTimes As button - -#### OnSelect - - -``` -=Set(Loading, true); -/* -Collects available meeting times for attendees based on user determined data from this page. Adds 'StartTime' and 'EndTime' columns to the collection as a means of simplifying the MeetingTimeSlot column -*/ -ClearCollect(MeetingTimes,AddColumns(Office365Outlook.FindMeetingTimes({MaxCandidates:15,MinimumAttendeePercentage: 1, MeetingDuration: MeetingDurationSelection.SelectedText.'data-ADB4D7A662F548B49FAC2B986E348A1BMinutes',Start:Text(DateAdd(DatePicker1.SelectedDate,MeetingStartRange.SelectedText.'data-ADB4D7A662F548B49FAC2B986E348A1BMinutes', Minutes), UTC),End:Text(DateAdd(DatePicker1.SelectedDate, MeetingEndRange.SelectedText.'data-ADB4D7A662F548B49FAC2B986E348A1BMinutes', Minutes), UTC),RequiredAttendees:Concat(FollowUpMeetingAttendees,UserPrincipalName & ";")}).MeetingTimeSuggestions,"StartTime",MeetingTimeSlot.Start.DateTime, -"EndTime",MeetingTimeSlot.End.DateTime)); -Set(ShowMeetingTimes, true); -Set(Loading, false) -``` -#### Text - - -``` -="Find Available Times" -``` -### TimeLine As gallery.galleryHorizontal - -#### Items - - -``` -=HoursList -``` -### SelectAvailableTime As label - -#### Size - - -``` -=15 -``` -#### Text - - -``` -="Select an available time" -``` -### AvailableTimesGall As gallery.galleryVertical - -#### Items - - -``` -=SortByColumns(MeetingTimes,"Confidence",Descending,"StartTime",Ascending) -``` -### LoadingIndicator3 As label - -#### Text - - -``` -="Retrieving available times..." -``` -## HomePopUpsScreen - ---- -### HomePopUpsScreen As screen - - -Gathers and stores the Office 365 profiles of the meeting attendees if they are within the app user's org -#### OnVisible - - -``` -If(IsEmpty(MeetingAttendees), - Set(Loading, true); - ClearCollect(MeetingAttendeeEmails, Filter(Split(Concatenate(SelectedMeeting.RequiredAttendees, - SelectedMeeting.OptionalAttendees), ";"), Result <> "")); - ClearCollect(MeetingAttendeesTemp, ForAll(MeetingAttendeeEmails, If(Lower(MyDomain) = Lower(Last(Split(Result, "@")).Result), Office365Users.UserProfileV2(Result), {displayName: Result, id: "", image: Blank(), jobTitle: "", userPrincipalName: Result}))); - ClearCollect(MeetingAttendees, RenameColumns(MeetingAttendeesTemp, "id", "Id", "jobTitle", "JobTitle", "displayName", "DisplayName", "userPrincipalName", "UserPrincipalName")); - Set(SelectedMeetingDuration, DateDiff(SelectedMeeting.Start, SelectedMeeting.End, Seconds)); - Set(Loading, false) -) -``` -### AssnTaskHeader_1 As label - -#### Size - - -``` -=27 -``` -#### Text - - -``` -=If(ShowDataLossWarning, "Welcome to your meeting!", "Assign Task") -``` -### AssnTaskDescription_1 As text - -### AssnTaskDateHeader_1 As label - -#### Size - - -``` -=10.5 -``` -#### Text - - -``` -="Due date" -``` -### AssnTaskToHeader_1 As label - -#### Size - - -``` -=10.5 -``` -#### Text - - -``` -="Assign to (your org only)" -``` -### AssnTaskGallery_2 As gallery.galleryVertical - -#### Items - - -``` -=/* -In-org attendee gallery for task assignment -If the attendee DisplayName is an actual name and not an email address, then they are in the app user's org, so we can assign them a task. -Tasks are stored in an 0365 tenant, so cannot be assigned to external users -*/ -Filter(AttendeeGallery1.AllItems, Not(".com" in DisplayName)) -``` -#### OnSelect - - -``` -=If(AssnTaskGallery_2.Visible, - Set(UserSelected, true); - Set(SelectedUser, {DisplayName:AssnTaskGallery_2.Selected.DisplayName, Id:AssnTaskGallery_2.Selected.Id, Image: AssnTaskGallery_2.Selected.AssnTaskUserImg_3.Image, JobTitle:AssnTaskGallery_2.Selected.JobTitle}) -) -``` -### AssnTaskSearchUser_2 As text - -### CancelAssnTask_1 As button - -#### OnSelect - - -``` -=Navigate(HomeScreen, None); -Set(ShowOverlay, !ShowOverlay); -If(TaskSelected, RemoveIf(Tasks, Id = SelectedTask.Id)); -Set(UserSelected, false); -Set(UserSelectedFromTasks, false); -Set(TaskSelected, false); -Reset(AssnTaskSearchUser_2); -Reset(AssnTaskDueDate_1); -Reset(AssnTaskDescription_1); -Reset(TaskTitle) -``` -#### Text - - -``` -=If(TaskSelected, "Delete", "Cancel") -``` -### SaveAssnTask_1 As button - -#### OnSelect - - -``` -=Navigate(HomeScreen, None); -Set(ShowOverlay, !ShowOverlay); -/*If user is making a new task, collect the information from form, otherwise, revise the task the user is editing*/ -If(!TaskSelected, - Collect(Tasks, {Id: CountRows(Tasks)+1, Name:AssnTaskDescription_1.Text, DueDate: AssnTaskDueDate_1.SelectedDate, -AssignToUser: SelectedUser}), - Patch(Tasks, LookUp(Tasks, Id=SelectedTask.Id), {Name:AssnTaskDescription_1.Text, DueDate: AssnTaskDueDate_1.SelectedDate, AssignToUser: SelectedUser})); -Set(UserSelected, false); -Set(UserSelectedFromTasks, false); -Set(TaskSelected, false); -Reset(AssnTaskSearchUser_2); -Reset(AssnTaskDueDate_1); -Reset(AssnTaskDescription_1); -Reset(TaskTitle) -``` -#### Text - - -``` -="Save task" -``` -### AssnTaskGallery_3 As gallery.galleryVertical - -#### Items - - -``` -=/*User search gallery*/ -If(!IsBlank(AssnTaskSearchUser_2.Text), Office365Users.SearchUser({searchTerm:Trim(AssnTaskSearchUser_2.Text), top:15})) -``` -#### OnSelect - - -``` -=Set(SelectedUser, {DisplayName:AssnTaskGallery_3.Selected.DisplayName, Id:AssnTaskGallery_3.Selected.Id, Image: AssnTaskGallery_3.Selected.AssnTaskUserImg_4.Image, JobTitle:AssnTaskGallery_3.Selected.JobTitle}); -Set(UserSelected, true) -``` -### LoadingIndicator2_2 As label - -#### Text - - -``` -="Searching for users..." -``` -### AssnTaskUserImg_5 As image - -#### Image - - -``` -=If(UserSelectedFromTasks,SelectedUserTasks.Image,SelectedUser.Image) -``` -#### OnSelect - - -``` -= -``` -### AssnTaskUserName_5 As label - -#### OnSelect - - -``` -= -``` -#### Size - - -``` -=8 -``` -#### Text - - -``` -=If(UserSelectedFromTasks,SelectedUserTasks.DisplayName,SelectedUser.DisplayName) -``` -### AssnTaskUserJob_5 As label - -#### OnSelect - - -``` -= -``` -#### Size - - -``` -=8 -``` -#### Text - - -``` -=If(UserSelectedFromTasks,SelectedUserTasks.JobTitle,SelectedUser.JobTitle) -``` -### DataWarningAccept_1 As button - -#### OnSelect - - -``` -=Set(ShowDataLossWarning, false); -Navigate(HomeScreen, None) -``` -#### Text - - -``` -="Got it!" -``` -### OrgAttendees_1 As label - -#### Text - - -``` -="No attendees in your org" -``` -## HomeScreen - ---- -### HomeScreen As screen - - -The main screen for meeting captures during a meeting. - -- create meeting notes -- create tasks -- see meeting details - -#### OnVisible - - -``` -/*if any additional meeting is captured in the same session, guarantees no confirmation screens are shown in error*/ -Set(FollowUpConfirmed, false); -Set(EmailConfirmed, false); -Set(ExportConfirmed, false) -``` -### AppLogo1 As image - -#### Image - - -``` -='nav-logo' -``` -### NavHome1 As image - -#### Image - - -``` -='nav-notes' -``` -### NavSketch1 As image - -#### Image - - -``` -='nav-sketch' -``` -#### OnSelect - - -``` -=Navigate(SketchScreen, None) -``` -### NavPhotos1 As image - -#### Image - - -``` -='nav-camera' -``` -#### OnSelect - - -``` -=Navigate(CameraScreen, None) -``` -### AttendeesBanner As label - -#### Size - - -``` -=10.5 -``` -#### Text - - -``` -="Attendees" -``` -### AttendeesBannerImage As image - -#### Image - - -``` -=attendees -``` -### AttendeeGallery1 As gallery.galleryVertical - -#### Items - - -``` -=MeetingAttendees -``` -### LoadingIndicator1 As label - -#### Size - - -``` -=10 -``` -#### Text - - -``` -="Gathering meeting attendees..." -``` -### MailAllButton As button - -#### OnSelect - - -``` -=Navigate(EmailScreen, None); -Set(MultiRecipients, true); -ClearCollect(EmailRecipients, AttendeeGallery1.AllItems) -``` -#### Text - - -``` -="Email" -``` -### NotesBanner As label - -#### Size - - -``` -=10.5 -``` -#### Text - - -``` -="Notes" -``` -### NotesIcon As image - -#### Image - - -``` -=notes -``` -### NotesInput As text - -### DetailsBanner As label - -#### Text - - -``` -="Meeting Details" -``` -### MeetingTitle As label - -#### Size - - -``` -=15 -``` -#### Text - - -``` -=SelectedMeeting.Subject -``` -### HomeTimeRange As label - -#### Size - - -``` -=10.5 -``` -#### Text - - -``` -=Text(SelectedMeeting.Start,"[$-en-US]mmmm dd, yyyy")&" | " & Lower(Text(SelectedMeeting.Start,"[$-en-US]hh:mm am/pm"))&" - "&Lower(Text(SelectedMeeting.End,"[$-en-US]hh:mm am/pm")) & " (" & DateDiff(SelectedMeeting.Start, SelectedMeeting.End, Minutes) & " minutes)" -``` -### Finish_SaveButton As button - -#### OnSelect - - -``` -=Navigate(ExportScreen, None) -``` -#### Text - - -``` -="Finish & Save" -``` -### Finish_SaveIcon As image - -#### Image - - -``` -=export -``` -#### OnSelect - - -``` -=Select(Finish_SaveButton) -``` -### TasksBanner As label - -#### Size - - -``` -=10.5 -``` -#### Text - - -``` -="Planner Tasks" -``` -### TasksIcon As image - -#### Image - - -``` -=tasks -``` -### TaskGallery As gallery.galleryVertical - -#### Items - - -``` -=Tasks -``` -#### OnSelect - - -``` -=If(CountRows(Tasks) > 0, -Set(SelectedTask, ThisItem); -Set(TaskSelected, true); -Set(UserSelected, true); -Set(UserSelectedFromTasks, true); -Set(SelectedUserTasks, ThisItem.AssignToUser); -Set(ShowOverlay, true) +=If(ShowOneNote, + Set(ShowOneNote, false); + Set(SelectedNoteBook, OneNoteBookSelect_1.SelectedText); + Set(SelectedSection, SectionsSelect_1.SelectedText); + Navigate(ExportScreen, None), + ShowPlanner, + Set(ShowPlanner, false); + Set(SelectedPlan, PlannerPlanSelect_1.SelectedText); + Set(SelectedBucket, PlannerBucketSelect_1.SelectedText); + Navigate(ExportScreen, None), + ShowOverlay, + Set(ShowOverlay, false); + Set(ExportConfirmed, true); + Navigate(ConfirmScreen, None) ) -``` -### TaskTitle As text - -### InitialTaskCount As label - -#### Size - - -``` -=10.5 -``` -#### Text - - -``` -="0 tasks" -``` -## SketchScreen - ---- -### SketchScreen As screen - - -Create a sketch during a meeting. -#### OnVisible - - -``` -Set(ShowSketchSaved, false) -``` -### AppLogo2 As image - -#### Image - - -``` -='nav-logo' -``` -### NavHome2 As image - -#### Image - - -``` -='nav-notes' -``` -#### OnSelect - - -``` -=Navigate(HomeScreen, None) -``` -### NavSketch2 As image - -#### Image - - -``` -='nav-sketch' -``` -### NavPhotos2 As image - -#### Image - - -``` -='nav-camera' -``` -#### OnSelect - - -``` -=Navigate(CameraScreen, None) -``` -### SaveSketch As button - -#### OnSelect - - -``` -=/*store sketches in sketch collection*/ -Set(SketchNumber, SketchNumber + 1); -Collect(Sketches, {Image:SketchCanvas.Image, Name: "Sketch" & SketchNumber & ".jpg"}); -Reset(SketchCanvas); -Set(ShowSketchSaved, true) -``` -#### Text - - -``` -="Save sketch" -``` -### SavedIndicator As label - -#### Size - -``` -=12 ``` #### Text ``` -="Saved!" +=If(ShowOverlay, "Yes, continue", "OK") ``` -## WelcomeScreen +## CollectionsAndVariables --- -### WelcomeScreen As screen - - -if any additional meeting is captured in the same session, guarantees all collections are empty -#### OnVisible - - -``` -Clear(MeetingAttendees); -Clear(MeetingTimes); -Clear(EmailRecipients); -Clear(FollowUpMeetingAttendees); -Clear(Tasks); -Clear(Photos); -Clear(Sketches); -Clear(EmailAttachments); -Reset(NotesInput); -Reset(AssnTaskSearchUser_1); -Set(FollowUpConfirmed, false); -Set(EmailConfirmed, false); -Set(ExportConfirmed, false); - -/*Email and OneNote templates with {placeholder} values for dynamic information*/ - -ClearCollect(Templates, -{Template: "Email", Value: "" & "{MeetingName}" & "
[ Meeting Capture ]
" & "{MeetingName}" & "
" & "{MeetingStartDate}" &" | " & "{MeetingStartTime}" & " - "& "{MeetingEndTime}" & " (" & "{MeetingMinutes}" & " Minutes)
-
" & "{1}" & "
Attendees (" & "{MeetingAttendeeNum}" & ")
Meeting details
" & "{MeetingDetails}" & "
Meeting Notes
" & "{MeetingNotes}" & "
" & "{2}" & "
Tasks
"}, -{Template: "OneNote", Value: "" & "{MeetingName}" & "
 
[ Meeting Capture ]
 
 
" & "{MeetingName}" & "
" & "{MeetingStartDate}" &" | " & "{MeetingStartTime}"&" - "& "{MeetingEndTime}" & " (" & "{MeetingMinutes}" & " Minutes)
 
" & "{1}" & "
Attendees (" & "{MeetingAttendeeNum}" & ")
 
 
Meeting NotesTasks
" & "{MeetingNotes}" & "" & "{2}" & "
 
 
"}) -``` -### MeetingsGalleryBkg As button - -#### OnSelect - - -``` -=Select(Parent) -``` -#### Text - - -``` -="" -``` -### LblMeetTitle As label - -#### OnSelect - - -``` -=Select(Parent) -``` -#### Text - - -``` -=ThisItem.Subject -``` -### LblStart_End As label - -#### OnSelect - - -``` -=Select(Parent) -``` -#### Text - - -``` -=Lower(Text(ThisItem.Start,"[$-en-US]hh:mm am/pm"))&" - "&Lower(Text(ThisItem.End,"[$-en-US]hh:mm am/pm"))&" | "&ThisItem.Location -``` -### BtnChangeAuto As button - -#### OnSelect - - -``` -=Set(AutoSelectMeeting, false) -``` -#### Text +### CollectionsAndVariables As screen -``` -="Change" -``` \ No newline at end of file +This screen lists all collections and variables used inside the app From 321bd9b8a62548dd07910dc5e8c745bc2d4cf090 Mon Sep 17 00:00:00 2001 From: Sebastian Muthwill Date: Mon, 18 Oct 2021 21:29:55 +0200 Subject: [PATCH 4/4] test: add test case for parser --- powerapps_docstring/tests/__init__.py | 0 powerapps_docstring/tests/test_parser.py | 40 ++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 powerapps_docstring/tests/__init__.py create mode 100644 powerapps_docstring/tests/test_parser.py diff --git a/powerapps_docstring/tests/__init__.py b/powerapps_docstring/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/powerapps_docstring/tests/test_parser.py b/powerapps_docstring/tests/test_parser.py new file mode 100644 index 0000000..b934f09 --- /dev/null +++ b/powerapps_docstring/tests/test_parser.py @@ -0,0 +1,40 @@ +import pytest + + +SOURCE_PATH = "example/src/meetingcapturedemo/" + + +def test_instantiate_parser(): + from powerapps_docstring.parser import Parser + p = Parser(SOURCE_PATH) + + assert isinstance(p, Parser), ("Should be an instance of parser object") + assert p.source_path == SOURCE_PATH + + +def test_get_connections(): + from powerapps_docstring.parser import Parser + p = Parser(SOURCE_PATH) + connections = p.get_connections() + + # spot check on some values in connection + for con in connections.items(): + + assert "connectionInstanceId" in con[1].keys() + assert "connectionParameters" in con[1].keys() + assert "connectionRef" in con[1].keys() + + +def test_get_screen_objects(): + from powerapps_docstring.parser import Parser + p = Parser(SOURCE_PATH) + result = p.get_screen_objects("WelcomeScreen.fx.yaml") + assert result[0] == "WelcomeScreen", "Should return on index 0 the name of the screen" + assert isinstance(result[1], dict), "Shall return on index 1 the screen contents as dict" + + +def test_get_canvas_manifest(): + from powerapps_docstring.parser import Parser + p = Parser(SOURCE_PATH) + result = p.get_canvas_manifest() + assert isinstance(result, dict), "Shall return a dict with CanvasManifest content"