CalendarはOutlookと同様に、Dataverseの予定やタスク、サーバーが登録する他のテーブルを日、勤務週、週、月、または週のリストで表示します。ツールバーは範囲やレイアウトを行き来し、忙しい一日は+以上にまとめられ、同時に予定も並べて表示されます。画面上で範囲の行を読み取り、グリッドと同じクエリとセキュリティを経て読み取り、ユーザーのタイムゾーンでの曜日と時刻も表示し、ポータル上のすべての日付が表示されます。各スタックにアドオンパッケージとして提供され、Fluent UIテーマで描画されます。
<Calendar regarding={{ tableName: 'account', id: accountId }} /><Calendar Regarding="@(new TableRecordReference("account", accountId))" />シュメラー&サンズに関する予約、アカウント詳細ページのデモが示すアカウント。 Regarding カレンダーを1つの記録の予約に保持しています。
Regardingがなければ、カレンダーは表示されたテーブルの中、ユーザーが読み取れるすべての行を表示します。サーバーがカレンダーに登録したテーブル、つまりノートやすべてのアクティビティテーブル、そしてForCalendarsに登録された他のすべてのテーブルも読み取ります。それぞれが独自の列で日付が付けられています:予定は開始日と終了、タスク、電話、手紙、ファックスは期限で示されます。予定やタスクは最初に表示されます。その他ユーザーが読むことができるものは、ツールバーの「ショー」メニューで提供されますが、その場合は電源が切れています。DefaultTables(React: defaultTables)最初に表示されるものを選択し、表示される可能性のあるものをTables(React: tables)選択します。カレンダーは自分の範囲と関連するレコードを独自の条件として加算するため、表示範囲は絞れますが、広げることはありません。
<Calendar defaultTables={['appointment', 'task', 'phonecall']} /><Calendar DefaultTables="@(["appointment", "task", "phonecall"])" />カレンダーにはユーザーが読むことができる予定だけが表示され、変更できる場所でのみ予約を移動できます。ポータルは通常、連絡先に招待された予定をrequiredattendeesでRowsInvolvingContact伝え、optionalattendeesはその予約のパーティーリストを読み上げますが、連絡先を自分のものにすることはありません。
// 連絡先は、必須または任意の出席者として招待された予約を読み上げます。
builder.Services.AddTableAccess("appointment", t => t
.ForSignedInUsers()
.RowsInvolvingContact("requiredattendees", "optionalattendees")
.Allow(TableSecurityPermission.Read)
.ReadingAllColumns());
// ユーザーが読めるすべての予約がポータルに届きます。招待されているだけで、その人が参加していると示されています。
builder.Services.Configure<SecurityOptions>(options =>
options.PortalVisibility.UnfilteredActivities.Add("appointment"));
他のアクティビティと同様に、予約は説明が *WEB*で始まる場合にのみポータルに届きます。テーブルが SecurityOptions.PortalVisibility.UnfilteredActivitiesにない場合を除く。カレンダーポータルは上記のようにそこにも appointment を追加するため、スタッフはいつも通りDynamicsやOutlookで予定を予約します。
ポータルのアプリケーションユーザーはDataverse内の予約リードも必要です。Dataverseはすべてのアクティビティタイプに一つの権限セットを付与するため、予約はPower Portals Pro Application Userの役割が既に持つリードオンアクティビティでカバーされます。
繰り返しの予定の発生は他の予定と同様に表示され、主題の横に繰り返しアイコンが表示されます。クリックすると、そのイベントを開くかシリーズ全体を開くかを尋ねます。移動やサイズ変更だけでそのイベントが変わります。カレンダーはDataverseが記録したイベントを表示します。Dataverseは環境の拡張ウィンドウ(デフォルトで12ヶ月)を前に記録し、時間の経過とともに後のイベントも記録するため、終わらないシリーズは1年分のイベントを表示します。
予定はOutlookの描き方で時間の表示で判定されます:色合いのように忙しく、横にバーがあり、バーだけで空いている、紫のストライプで仮のストライプでオフィス外で、ステータス理由から読み取られます。完了した予定は忙しいと表示され、キャンセルされた予定は対象が消線で空いていると表示されます。月では、時刻の予定はその横に点が表示され、議題の列では色だけが表示されます。あなたが提供した予約は ShowAs と Canceled (React: showAs と canceled)を取り、それぞれにクラス( ppp-calendar-appointment-free、 -busy、 -tentative、 -out-of-office 、 -canceled )が描かれ、スタイリングが加えられます。
Editableカレンダーで独自の予定を読み込む場合、時間を選択するとその上に新しい予定が開き、Regardingレコードについての新しい予定が開き、予約をクリックするとその詳細がフォームとして開きます。フォームは他のレコードと同じテーブル、行、列のセキュリティで保存されます。行を移動またはリサイズすると、開始・終了、そして丸一日かかるかどうかも保存されます。ユーザーが行や列を変更しても完了、キャンセル、非アクティブにはなりません。タスクの締め切りのように一つの日付を保持するテーブルは移動してもサイズ変更せず、作成日で日付が付けられた行はそのまま残ります。別のテーブルの行をクリックするとフォームが開きます。登録された列が表示されるか、カレンダー内のMultiTableFormである自分のテーブルフォーム(React: forms)が表示されます。予約の詳細や他のテーブルのフォームは、中央のダイアログで開かれ、FormLocation(React: formLocation)では左側または右側のサイドパネルに表示されます。参加者は PartyListEdit で編集され、ColumnEdit はすべてのパーティーリストにもこのアドレスを使います。メールの「To」「From」「CC」も含まれます。ユーザーが入力すると、メールアドレスを持つ連絡先、アカウント、ユーザー(Read and Append To)を提案し、両方を持たないテーブルは検索しません。どちらか一方を選ぶとチップとして追加されます。環境が未解決のメール受信者へのメッセージを許可している場合、あるいはAllowUnresolvedEmailAddressesがそう言っている場合、Enterで自動的に記録と一致しないメールアドレスが追加されます。アメージメントのRegardingは、ユーザーが読みリンクできる記録を指し示せるテーブルを提供します。RegardingTables(React: regardingTables)は、あなたが名前を挙げたものに絞り込みます。代わりにOnRangeSelectで自分なりの予約を作成し、(React: onAppointmentChange)SaveChangeで自分のやり方で移動を保存しましょう。
<Calendar regarding={account} editable regardingTables={['account', 'contact']} />
{/* Anywhere a party list is edited */}
<PartyListEdit columnName="to" allowUnresolvedEmailAddresses /><Calendar Regarding="@account"
Editable="true"
RegardingTables="@(["account", "contact"])" />
<!-- Anywhere a party list is edited -->
<PartyListEdit ColumnName="to" AllowUnresolvedEmailAddresses="true" />Editableカレンダーでは、予約フォームは「繰り返し」を提供します:毎日または平日、曜日、月ごとまたは年次(日付や第2火曜日など)に、数回またはある日の後に終了しない。Dataverseはユーザーのタイムゾーンでイベントを配置するため、10時の会議は時計の変更に間違う10時に維持されます。シリーズは独自の形態として始まり、繰り返しの方法を変更でき、イベントの削除はそれやシリーズ全体を削除することができます。繰り返しは、既に存在する予約に対しては変更・削除が可能なユーザーrecurringappointmentmaster提供されます。なぜなら、それがシリーズとなるからです。予約を付与するのと同様にシリーズを付与し、Dataverseのアプリユーザーに「Read on Connection」を付与します。予約をシリーズにすると接続が読み取られ、Dataverseはそれなしの保存を拒否します。
// シリーズはそれ自体の表の記録であり、その発生は任命です。
builder.Services.AddTableAccess("recurringappointmentmaster", t => t
.ForSignedInUsers()
.RowsOwnedByContact("requiredattendees")
.Allow(TableSecurityPermission.Read | TableSecurityPermission.Create
| TableSecurityPermission.Write | TableSecurityPermission.Delete)
.ReadingAllColumns()
.WritingAllColumns());
builder.Services.Configure<SecurityOptions>(options =>
options.PortalVisibility.UnfilteredActivities.Add("recurringappointmentmaster"));
新しい予定、または変更は、同じ取引内で他のセーブデータとシリーズになります。保存は予約の隣に1つの AddRecurrenceRequest を送るため、予約はシリーズなしで保存されることはありません。Dataverseは予約から参加者と共にシリーズを作成し、予約を削除します。ページは独自のフォームを構築する場合も同様にリクエストを送信できます。
Outlook: Dataverseのように、次の出来事から始まったシリーズは、終了した出来事を独自の連載として保持し、シリーズの起 groupidを共有しているため、起こったままのままです。シリーズのカウントはシリーズ全体の終わりを経て終わります。ポータルは既に保持された出来事と共に読み、保存します。そして、今後の出来事が残っていないシリーズは、もはや変更できません。 「一日中 切り替え」は時間に合います:オンはその日が始まる日、オフは1日目の9時、30分間。データバースは一日中予定を一日として管理します。ポータルはユーザーのタイムゾーンに関係なく、その日を表示・保存します。
代わりに Appointments パスすると、カレンダーはDataverseを読むのではなく、そのページを表示します。 Editable をオンにすると、予約は範囲を選択して移動、サイズ変更、作成できます: SaveChange (React: onAppointmentChange)は移動を保存し、falseを返すと予約が戻ります。 OnRangeSelect は選択した範囲を受け取り、開かれた予約を返 OnAppointmentClick します。
<Calendar appointments={appointments}
editable
onAppointmentChange={saveMove}
onAppointmentClick={openAppointment} /><Calendar Appointments="appointments"
Editable="true"
SaveChange="SaveMoveAsync"
OnAppointmentClick="OpenAppointment" />ポインターをアポイントに置くと、その主題、時間、場所が表示され、クリックすると詳細のダイアログが開きます。これはDataverseから読み取るのと同じテーブルアクセスとカラムセキュリティでレコードを読み取るのと同じ方法で、読み取り専用に表示されます。 OnAppointmentClick (React: onAppointmentClick)操作して、クリックで他のことを行えば、例えば自分のページを開くこともあります。カレンダーの行、ツールチップ、詳細ダイアログはそれぞれ自分なりに描くことができます:カスタム レンダリングを参照してください。
ツールバーに自分のコントロールを、グリッドのツールバーボタンと同様に検索ボックスの前にToolbarItems(React:カレンダーの子)を配置してください。CalendarButtonはクリックするとカレンダーが渡されます:表示される期間、記録、CreateAppointmentAsyncとRefreshAsync(React:createAppointmentとrefresh)です。NewAppointmentCalendarButton、時間選択と同じように新しい予定を開始します。表示された期間が今日を反映した次の30分から、そうでなければ初日の8時から、そしてそれが何かを始める場所、つまりホストがOnRangeSelectを扱う、あるいはユーザーが作成できる予定を読み込むEditableカレンダーです。
<Calendar regarding={account} editable>
<NewAppointmentCalendarButton />
{/* 自分のボタンを押すとカレンダーが手渡された */}
<CalendarButton
label="Export"
icon={<ArrowDownloadRegular />}
onClick={(calendar) => exportAsync(calendar.start, calendar.end)}
/>
</Calendar><Calendar Regarding="@account" Editable="true">
<ToolbarItems>
<NewAppointmentCalendarButton />
<!-- 自分のボタンを押すとカレンダーが手渡された -->
<CalendarButton Label="Export"
Icon="@(new Icons.Regular.Size20.ArrowDownload())"
OnClick="@((CalendarContext calendar) => ExportAsync(calendar.Start, calendar.End))" />
</ToolbarItems>
</Calendar>カレンダーは1日の時間、平日や週、月日数、または予定リストごとに予定を並べ、ツールバーにはそれらを切り替えるピッカーがあります。 DefaultLayout (React: defaultLayout)は開く1週間で、別の週を選ばない限り開きます。 Layouts (React: layouts)は、順番に記載した指定したものに割り当てます。1つ名前を挙げれば、ピックは移動し、カレンダーはその中に残ります。各レイアウトには「 Day」「 Work Week」「Week」「 Month」「 Month 」「 Agenda」というページがあります。
<Calendar defaultLayout="month" layouts={['month', 'agenda']} /><Calendar DefaultLayout="CalendarLayout.Month"
Layouts="@([CalendarLayout.Month, CalendarLayout.Agenda])" />ViewIdsでビュー(Dataverseのビュー、それぞれが独立したテーブルを持つ)、MultiTableViewIds、AddMultiTableViewに登録されたまたはDataverseに保存されている複数のテーブルのビュー、CustomViewDefinitionsコードで定義されたビューを提供し、ツールバーにはカレンダーに表示されるものを選ぶピッカーがあります。DefaultViewIdが開くウィンドウです。検索ボックスはグリッドの検索のように各テーブルの検索列を見つけます。AllowSearchでオフにしてください。
AllowFilteringでは、ツールバーのフィルターメニューに編集フィルターがあり、表示されたテーブルのフィルターを開き、名前の順に各タブを開き、各ダイアログのグリッドのフィルターボタンが開きます。テーブルの列の条件、グループにネストされた状態、フィルター可能な関連テーブル、ユーザーが読むことができる列やテーブルの上で。タブの列は最初に開いたときに読み取られます。フィルターはビューの代わりに機能し、ユーザーが別のビューを選択するまで続きます。デフォルトではオフにされており、ユーザーはビューのすべてのフィルターを削除できます。
AllowSavedViews(React: allowSavedViews)では、サインインしたユーザーはカレンダーに表示されたもの(ビュー、フィルター、表示されたテーブル、レイアウト)を自分のビューとして保存し、デフォルトビューを選択して使わないビューをツールバーのフィルターメニューから非表示にできます。予定のグリッド上には予定のみのビューも提供され、タイムライン上の複数のテーブルのビューも見られます。ビューの保存、変更、共有方法は「保存済みビュー」ページにあります。
<Calendar viewIds={[allAppointmentsViewId, scheduledViewId]}
defaultViewId={allAppointmentsViewId}
customViewDefinitions={teamsMeetings}
allowFiltering
allowSavedViews /><Calendar ViewIds="@([allAppointmentsViewId, scheduledViewId])"
DefaultViewId="allAppointmentsViewId"
CustomViewDefinitions="teamsMeetings"
AllowFiltering="true"
AllowSavedViews="true" />Schmeler and Sonsの会議、タスク、電話通話は、コードで定義された2つのビュー「 meetings and tasks」と 「まだやること 」(まだ完了していないタスクや通話、各テーブルのクエリ)を通じて行われます。フィルターメニューは各テーブルのオン・オフを切り替え、 編集フィルター にはそれぞれのタブがあり、サインインしている訪問者はカレンダーに表示されたものを自分のビューとして保存できます。タスクや通話は右側のサイドパネル(FormLocation)で開きます。
クエリパラメータを PersistedStateQueryParameterに設定すると、カレンダーはレイアウト、表示される期間、そしてそこで選んだ予定ビューを保持し、リロードや共有リンクで元の位置から開きます。本来開くはずの時間は省略されます。日付は省略されます。表示された期間には今日が含まれているため、現在の週へのリンクが今日の後に続きます。 IncludeSearchInPersistedStateをオンにすると検索も保持されますが、ユーザーが検索する内容が機密扱いになるため、デフォルトでは省略されます。変更ごとにブラウザの履歴エントリが置き換えられるため、Backはページを離れ、毎週戻ることはありません。両方のスタックは同じ値を書き込むため、一方で作成したリンクはもう一方で同じカレンダーを開きます。
<Calendar defaultLayout="month" persistedStateQueryParameter="calendarState" /><Calendar DefaultLayout="CalendarLayout.Month" PersistedStateQueryParameter="calendarState" />コードで定義されたビューは、Teamsで開催された会議のカレンダーを保持し、週の議題に開いて設定された高さで表示します。
カレンダーはアドオンで、Blazorで PowerPortalsPro.Web.Blazor.Calendar 、Reactで @powerportalspro/react-calendar します。フレームワークの隣にパッケージを追加して使うことができます。
npm install @powerportalspro/react-calendardotnet add package PowerPortalsPro.Web.Blazor.Calendar名称 | 種類 | デフォルト | 概要 |
|---|---|---|---|
AllowFiltering | bool | False | |
AllowSavedViews | bool | False | |
AllowSearch | bool | True | |
AppointmentDetails | RenderFragment? | ||
Appointments | IReadOnlyList<CalendarAppointment>? | ||
ChildContent | RenderFragment? | ||
CssClass | string? | ||
CustomViewDefinitions | List<MultiTableViewDefinition>? | ||
DefaultLayout | CalendarLayout | Week | |
DefaultTables | IEnumerable<string>? | ||
DefaultViewId | Guid? | ||
Editable | bool | False | |
FormLocation | DialogLocation | Center | |
Height | string | 600px | |
IncludeSearchInPersistedState | bool | False | |
Layouts | IReadOnlyList<CalendarLayout>? | ||
MatchParties | bool? | ||
MultiTableViewIds | IEnumerable<Guid>? | ||
PersistedStateQueryParameter | string? | ||
Regarding | TableRecordReference? | ||
RegardingTables | IReadOnlyList<string>? | ||
SaveChange | Func<CalendarAppointmentChange, Task<bool>>? | ||
SavedViewsKey | string? | ||
Series | MultiTableSeries? | ||
ShowRecordLinks | bool | True | |
SignInUrl | string | Account/Login | |
Tables | IEnumerable<string>? | ||
ToolbarItems | RenderFragment? | ||
TooltipTemplate | RenderFragment<CalendarAppointment>? | ||
ViewIds | IEnumerable<Guid>? | ||
ViewSort | ViewSort | NameAscending |
AllowFilteringAllowSavedViewsAllowSearchAppointmentDetailsAppointmentsChildContentCssClassCustomViewDefinitionsDefaultLayoutDefaultTablesDefaultViewIdEditableFormLocationHeightIncludeSearchInPersistedStateLayoutsMatchPartiesMultiTableViewIdsPersistedStateQueryParameterRegardingRegardingTablesSaveChangeSavedViewsKeySeriesShowRecordLinksSignInUrlTablesToolbarItemsTooltipTemplateViewIdsViewSort名称 | 種類 | 概要 |
|---|---|---|
OnAppointmentClick | EventCallback<string> | |
OnRangeSelect | EventCallback<CalendarRangeSelection> |
OnAppointmentClickOnRangeSelect名称 | パラメータ | 種類 | 概要 |
|---|---|---|---|
CreateAppointmentAsync | DateTimeOffset? start DateTimeOffset? end bool allDay | Task | |
LoadAppointmentsAsync | DateTimeOffset start DateTimeOffset end | Task<IReadOnlyList<CalendarAppointment>> | |
OnAppointmentChangeAsync | CalendarAppointmentChange change | Task<bool> | |
OnAppointmentClickAsync | string id string subject bool recurring string table | Task | |
OnRangeChanged | RangeChanged range | void | |
OnRangeSelectAsync | DateTimeOffset start DateTimeOffset end bool allDay | Task | |
RefreshAsync | Task | ||
RenderTooltip | string id | int |
CreateAppointmentAsyncLoadAppointmentsAsyncOnAppointmentChangeAsyncOnAppointmentClickAsyncOnRangeChangedOnRangeSelectAsyncRefreshAsyncRenderTooltip