fix(MyShares): correct order if items in MyShares view, when grouped by Files
This commit is contained in:
@@ -786,9 +786,7 @@ mod integration_tests {
|
||||
let mut ids = Vec::with_capacity(8);
|
||||
for i in 0..8 {
|
||||
let g = repo
|
||||
.create(
|
||||
&SubjectGroup::new(&rand_name(&format!("cyc8-{i}")), None).unwrap(),
|
||||
)
|
||||
.create(&SubjectGroup::new(&rand_name(&format!("cyc8-{i}")), None).unwrap())
|
||||
.await
|
||||
.unwrap();
|
||||
ids.push(g.id);
|
||||
@@ -843,9 +841,7 @@ mod integration_tests {
|
||||
let mut ids = Vec::with_capacity(len);
|
||||
for i in 0..len {
|
||||
let g = repo
|
||||
.create(
|
||||
&SubjectGroup::new(&rand_name(&format!("depth-{i}")), None).unwrap(),
|
||||
)
|
||||
.create(&SubjectGroup::new(&rand_name(&format!("depth-{i}")), None).unwrap())
|
||||
.await
|
||||
.unwrap();
|
||||
ids.push(g.id);
|
||||
@@ -855,9 +851,7 @@ mod integration_tests {
|
||||
for i in 0..(len - 1) {
|
||||
repo.add_member(ids[i], GroupMember::Group(ids[i + 1]), admin)
|
||||
.await
|
||||
.unwrap_or_else(|e| {
|
||||
panic!("edge {i} should fit in the depth budget: {:?}", e)
|
||||
});
|
||||
.unwrap_or_else(|e| panic!("edge {i} should fit in the depth budget: {:?}", e));
|
||||
}
|
||||
|
||||
// Lift the whole chain under a new outer group → subtree depth 9.
|
||||
|
||||
@@ -1401,30 +1401,29 @@ impl AuthorizationEngine for PgAclEngine {
|
||||
.filter_map(|rid| {
|
||||
let (resource_type, first_shared_at, subj_map) = resource_map.remove(&rid)?;
|
||||
let mut grants: Vec<OutgoingGrantEntry> = subj_map.into_values().collect();
|
||||
let role_rank = |perms: &[Permission]| -> u8 {
|
||||
if perms.contains(&Permission::Delete) && perms.contains(&Permission::Share) {
|
||||
0 // admin → Can manage
|
||||
} else if perms.contains(&Permission::Create)
|
||||
|| perms.contains(&Permission::Update)
|
||||
{
|
||||
1 // editor → Can edit
|
||||
} else {
|
||||
2 // viewer → Can view
|
||||
// Per-resource subject ordering (matches the subject-sort
|
||||
// branch's SQL CASE):
|
||||
// 0 = group, 1 = user, 2 = token-with-password, 3 = token,
|
||||
// 4 = external.
|
||||
// Alphabetical tiebreak by display name. This intentionally
|
||||
// ignores role/permission tier — the share dialog renders
|
||||
// role as a separate pill; ordering by subject type is the
|
||||
// UX contract.
|
||||
let subject_rank = |e: &OutgoingGrantEntry| -> u8 {
|
||||
match e.subject_type.as_str() {
|
||||
"group" => 0,
|
||||
"user" => 1,
|
||||
"token" if e.has_password => 2,
|
||||
"token" => 3,
|
||||
_ => 4,
|
||||
}
|
||||
};
|
||||
grants.sort_by(|a, b| {
|
||||
role_rank(&a.permissions)
|
||||
.cmp(&role_rank(&b.permissions))
|
||||
.then_with(|| {
|
||||
// users before tokens
|
||||
let type_rank = |st: &str| if st == "user" { 0u8 } else { 1 };
|
||||
type_rank(&a.subject_type).cmp(&type_rank(&b.subject_type))
|
||||
})
|
||||
.then_with(|| {
|
||||
a.subject_display
|
||||
.to_lowercase()
|
||||
.cmp(&b.subject_display.to_lowercase())
|
||||
})
|
||||
subject_rank(a).cmp(&subject_rank(b)).then_with(|| {
|
||||
a.subject_display
|
||||
.to_lowercase()
|
||||
.cmp(&b.subject_display.to_lowercase())
|
||||
})
|
||||
});
|
||||
Some(OutgoingResourceSummary {
|
||||
resource_type,
|
||||
|
||||
Reference in New Issue
Block a user