-
-
-
- Legacy Off
-
- setShareType('tag')}
- >
-
- By Tag
-
-
+ {/* Add new share rule */}
+
+
+
+
+ Legacy Off
+
+ setShareType('tag')}
+ >
+
+ By Tag
+
+
- {/* Share Mode Selection */}
-
-
setShareMode('ADD_USER')}
- >
-
- Collaborate
-
-
setShareMode('SEND_TASK')}
- >
-
- Handoff
-
-
+ {/* Share Mode Selection */}
+
+
setShareMode('ADD_USER')}
+ >
+
+ Collaborate
+
+
setShareMode('SEND_TASK')}
+ >
+
+ Handoff
+
+
-
- {
- if (val) {
- setShareTag(val);
- const tagDef = store.tagDefinitions.find(t => t.name === val);
- const isBucket = tagDef?.isBucket || store.buckets.some(b => b.name === val);
- const isUser = tagDef?.isUser;
+
+ {
+ if (val) {
+ setShareTag(val);
+ const tagDef = store.tagDefinitions.find(t => t.name === val);
+ const isBucket = tagDef?.isBucket || store.buckets.some(b => b.name === val);
+ const isUser = tagDef?.isUser;
- if (isBucket) {
- setShareMode('SEND_TASK');
- } else if (isUser) {
- setShareMode('ADD_USER');
+ if (isBucket) {
+ setShareMode('SEND_TASK');
+ } else if (isUser) {
+ setShareMode('ADD_USER');
+ }
}
- }
- }}
- options={store.tagDefinitions.filter(t => t.name.startsWith("@")).map(t => t.name)}
- placeholder="Select a tag"
- itemComponent={(props: any) => {props.item.rawValue} }
- >
-
- {shareTag() || "Select a tag..."}
-
-
-
-
+ }}
+ options={store.tagDefinitions.filter(t => t.name.startsWith("@")).map(t => t.name)}
+ placeholder="Select a tag"
+ itemComponent={(props: any) => {props.item.rawValue} }
+ >
+
+ {shareTag() || "Select a tag..."}
+
+
+
+
+
+
+
+ value={allUsers().find(u => u.id === shareUserId()) || null}
+ onChange={(user) => setShareUserId(user?.id || "")}
+ options={availableUsers()}
+ optionValue="id"
+ optionTextValue="name"
+ placeholder={usersLoading() ? "Loading..." : "Select user..."}
+ itemComponent={(itemProps: any) => (
+ {itemProps.item.rawValue.name}
+ )}
+ >
+
+ >
+ {(state) => state.selectedOption()?.name || "Select user..."}
+
+
+
+
+
{
+ if (shareUserId() && shareTag()) {
+ await addShareRule('tag', shareUserId(), shareTag(), shareMode());
+ setShareUserId("");
+ }
+ }}
+ >
+
+ Share
+
+
+
+ {shareMode() === 'ADD_USER'
+ ? "Collaborative contexts add access through the selected @tag."
+ : "Handoff contexts transfer ownership when that @tag is applied."}
+
-
-
- value={allUsers().find(u => u.id === shareUserId()) || null}
- onChange={(user) => setShareUserId(user?.id || "")}
- options={availableUsers()}
- optionValue="id"
- optionTextValue="name"
- placeholder={usersLoading() ? "Loading..." : "Select user..."}
- itemComponent={(itemProps: any) => (
- {itemProps.item.rawValue.name}
- )}
- >
-
- >
- {(state) => state.selectedOption()?.name || "Select user..."}
-
-
-
-
-
{
- if (shareUserId() && shareTag()) {
- await addShareRule('tag', shareUserId(), shareTag(), shareMode());
- setShareUserId("");
- }
- }}
- >
-
- Share
-
-
- {shareMode() === 'ADD_USER'
- ? "Collaborative contexts add access through the selected @tag."
- : "Handoff contexts transfer ownership when that @tag is applied."}
-
-
-
- {/* Active share rules */}
- {/* Active share rules - Outgoing */}
-
-
-
- Sharing With Others
-
-
{
- const tagDef = r.type === 'tag' ? store.tagDefinitions.find(t => t.name === r.tagName) : null;
- const isBucketTag = r.type === 'tag' && store.buckets.some(b => b.name === r.tagName);
- const isSystem = tagDef?.isUser || tagDef?.isBucket || isBucketTag;
- const isOwner = r.ownerId === pb.authStore.model?.id;
- return !isSystem && isOwner;
- })} fallback={
-
- You aren't sharing with anyone yet.
-
- }>
- {(rule) => (
-
-
-
- {rule.type === 'all' ? : }
-
-
-
To: {getUserName(rule.targetUserId)}
-
- {rule.type === 'all' ? 'All Tasks' : `Tag: ${rule.tagName} `}
- •
- updateShareRule(rule.id, {
- share_mode: rule.share_mode === 'SEND_TASK' ? 'ADD_USER' : 'SEND_TASK'
- })}
- >
- {rule.share_mode === 'SEND_TASK' ? 'HANDOFF' : 'COLLAB'}
-
-
-
-
-
removeShareRule(rule.id)}
- >
-
-
-
- )}
-
-
-
- {/* Active share rules - Incoming */}
-
-
-
- Shared With You
-
-
{
- const tagDef = r.type === 'tag' ? store.tagDefinitions.find(t => t.name === r.tagName) : null;
- const isBucketTag = r.type === 'tag' && store.buckets.some(b => b.name === r.tagName);
- const isSystem = tagDef?.isUser || tagDef?.isBucket || isBucketTag;
- const isTarget = r.targetUserId === pb.authStore.model?.id;
- return !isSystem && isTarget;
- })} fallback={
-
- No one has shared with you yet.
-
- }>
- {(rule) => (
-
-
-
- {rule.type === 'all' ? : }
-
-
-
From: {getUserName(rule.ownerId)}
-
- {rule.type === 'all' ? 'All Tasks' : `Tag: ${rule.tagName} `}
- •
- {rule.share_mode === 'SEND_TASK' ? 'HANDOFF' : 'COLLAB'}
-
-
-
- {/* No delete button for incoming rules unless we add leave logic later */}
-
- )}
-
-
-
- {/* Active share rules - System */}
-
-
-
-
-
- System Rules (Auto-Generated)
-
-
+ {/* Active share rules */}
+ {/* Active share rules - Outgoing */}
+
+
+
+ Sharing With Others
+
{
const tagDef = r.type === 'tag' ? store.tagDefinitions.find(t => t.name === r.tagName) : null;
const isBucketTag = r.type === 'tag' && store.buckets.some(b => b.name === r.tagName);
- return tagDef?.isUser || tagDef?.isBucket || isBucketTag;
- })}>
- {(rule) => {
- const tagDef = store.tagDefinitions.find(t => t.name === rule.tagName);
- return (
-
-
-
-
-
- {/* If it's a user tag, show the person's name. If it's a bucket, show the bucket name (tagName). */}
- {tagDef?.isUser ? getUserName(rule.targetUserId) : rule.tagName}
- {tagDef?.isUser ? : }
-
-
- Auto-shared via {tagDef?.isUser ? 'User' : 'Bucket'} Tag
- •
- updateShareRule(rule.id, {
- share_mode: rule.share_mode === 'SEND_TASK' ? 'ADD_USER' : 'SEND_TASK'
- })}
- >
- {rule.share_mode === 'SEND_TASK' ? 'HANDOFF' : 'COLLAB'}
-
-
-
+ const isSystem = tagDef?.isUser || tagDef?.isBucket || isBucketTag;
+ const isOwner = r.ownerId === pb.authStore.model?.id;
+ return !isSystem && isOwner;
+ })} fallback={
+
+ You aren't sharing with anyone yet.
+
+ }>
+ {(rule) => (
+
+
+
+ {rule.type === 'all' ? : }
+
+
+
To: {getUserName(rule.targetUserId)}
+
+ {rule.type === 'all' ? 'All Tasks' : `Tag: ${rule.tagName} `}
+ •
+ updateShareRule(rule.id, {
+ share_mode: rule.share_mode === 'SEND_TASK' ? 'ADD_USER' : 'SEND_TASK'
+ })}
+ >
+ {rule.share_mode === 'SEND_TASK' ? 'HANDOFF' : 'COLLAB'}
+
+
- );
- }}
+
removeShareRule(rule.id)}
+ >
+
+
+
+ )}
-
+
+ {/* Active share rules - Incoming */}
+
+
+
+ Shared With You
+
+
{
+ const tagDef = r.type === 'tag' ? store.tagDefinitions.find(t => t.name === r.tagName) : null;
+ const isBucketTag = r.type === 'tag' && store.buckets.some(b => b.name === r.tagName);
+ const isSystem = tagDef?.isUser || tagDef?.isBucket || isBucketTag;
+ const isTarget = r.targetUserId === pb.authStore.model?.id;
+ return !isSystem && isTarget;
+ })} fallback={
+
+ No one has shared with you yet.
+
+ }>
+ {(rule) => (
+
+
+
+ {rule.type === 'all' ? : }
+
+
+
From: {getUserName(rule.ownerId)}
+
+ {rule.type === 'all' ? 'All Tasks' : `Tag: ${rule.tagName} `}
+ •
+ {rule.share_mode === 'SEND_TASK' ? 'HANDOFF' : 'COLLAB'}
+
+
+
+ {/* No delete button for incoming rules unless we add leave logic later */}
+
+ )}
+
+
+
+ {/* Active share rules - System */}
+
+
+
+
+
+ System Rules (Auto-Generated)
+
+
+
{
+ const tagDef = r.type === 'tag' ? store.tagDefinitions.find(t => t.name === r.tagName) : null;
+ const isBucketTag = r.type === 'tag' && store.buckets.some(b => b.name === r.tagName);
+ return tagDef?.isUser || tagDef?.isBucket || isBucketTag;
+ })}>
+ {(rule) => {
+ const tagDef = store.tagDefinitions.find(t => t.name === rule.tagName);
+ return (
+
+
+
+
+
+ {/* If it's a user tag, show the person's name. If it's a bucket, show the bucket name (tagName). */}
+ {tagDef?.isUser ? getUserName(rule.targetUserId) : rule.tagName}
+ {tagDef?.isUser ? : }
+
+
+ Auto-shared via {tagDef?.isUser ? 'User' : 'Bucket'} Tag
+ •
+ updateShareRule(rule.id, {
+ share_mode: rule.share_mode === 'SEND_TASK' ? 'ADD_USER' : 'SEND_TASK'
+ })}
+ >
+ {rule.share_mode === 'SEND_TASK' ? 'HANDOFF' : 'COLLAB'}
+
+
+
+
+
+ );
+ }}
+
+
+
@@ -506,7 +506,7 @@ export const SettingsView: Component<{ setView?: (v: string) => void }> = (props
Shared Buckets
- Each bucket is a real `@context` with a policy, metadata, soft delete, and personal pinning.
+ Buckets are shared spaces where tasks can be moved and collaborated on.
{isBucketsOpen() ? : }